2016-11-22 1 views
0

펄 프로그램에서 NYTProf를 실행했는데, "언팩"을 한 행이 많은 시간을 필요로한다는 사실에 놀랐습니다. (줄은 14654 번 실행되고 39.6ms가 걸렸습니다). 하지만 unpack() 함수 자체가 매우 빠릅니다.느린 펄 성능, 개선 이유 및 방법

$delme1 = substr($data, 47,1) 
    $_flags = unpack("C", $delme1); 
    # spent 2.98ms making 14654 calls to main::CORE:unpack, avg 203ns/call 

왜 이런 큰 오버 헤드가 발생했는지 알 수 있습니다.

감사 1

업데이트 "압축"호출로 라인을 참조하십시오. 총 39.6ms를 소비했다고합니다.

enter image description here

+0

왼쪽에있는 숫자가 무엇인지 모르겠지만 합계는 2.98ms이고 각 패스에는 2.98ms/14654 통화 = 203ns/통화가 걸렸다 고 말한 것입니다 – ikegami

+0

39.6ms의 열에는 제목 "시간 온라인"NYTProf에 따라. 2.98ms의 열은 "Timein subs"입니다. 몇 줄이있는 루틴에서 소비 한 총 시간을 살펴보면 전체 시간 동안 39.6ms 가량 가중됩니다. 여하튼, CPU는 그 라인에서 많은 시간을 보냈습니다. – packetie

+0

Coroberation :'perl -MBenchmark = timethis -e'timethis (-3.1) {my $ x = unpack ("C", "X");}});'출력' 3283.39/s'이며, 이것은 1 개 unpack + assignment + loop마다 304ns입니다. – ikegami

답변

2

라인은 14654 번 실행하고 14,654 시간 39.6ms

아니, 라인이 실행있어

했다 및 2.98ms했다있어. 각 실행에는 평균 203ns가 소요되었습니다. 정확히 느린하지 ...


당신은

$_flags = ord(substr($data, 47, 1)); 

또는

$_flags = unpack('x47 C', $data); 

를 사용하여 시도 할 수

최적화하기 위해 반드시 좋은 일이있다. 예를 들어, substr에 대한 다중 호출을 사용하지 않고 단일 압축을 풀면 도움이됩니다.

+0

네 말이 맞아, 나는 시간을 어떻게 걸리는지 깨뜨렸다. unpack() 호출이 나타납니다. unpack() 함수 자체가 매우 효율적이라는 것을 감안할 때 호출을 호출하는 오버 헤드가 매우 비쌉니다. 속도를 높이는 방법이 있는지 궁금합니다. – packetie

+0

'unpack '을 호출하는 데 오버 헤드가 없습니다. 조금도. 서브 루틴이 아니기 때문에 실제 호출이 없기 때문에; 그것은'+'와 같은 연산자입니다. – ikegami