문제

나는 자주 실행되는 일부 Perl 코드를 최적화하고 있습니다(파일당 하루에 한 번).

주석으로 인해 Perl 스크립트가 느려지나요?내 실험은 아니오를 지향합니다.

use Benchmark;
timethese(20000000, {
    'comments' => '$b=1;
# comment  ... (100 times)
', 'nocomments' => '$b=1;'});

노이즈를 제외하면 거의 동일한 값을 제공합니다.

Benchmark: timing 10000000 iterations of comments, nocomments...
  comments:  1 wallclock secs ( 0.53 usr +  0.00 sys =  0.53 CPU) @ 18832391.71/s (n=10000000)
nocomments:  0 wallclock secs ( 0.44 usr +  0.00 sys =  0.44 CPU) @ 22935779.82/s (n=10000000)

Benchmark: timing 20000000 iterations of comments, nocomments...
  comments:  0 wallclock secs ( 0.86 usr + -0.01 sys =  0.84 CPU) @ 23696682.46/s (n=20000000)
nocomments:  1 wallclock secs ( 0.90 usr +  0.00 sys =  0.90 CPU) @ 22099447.51/s (n=20000000)

주석 버전과 주석 없는 버전을 별도의 Perl 스크립트로 실행하면 비슷한 결과를 얻습니다.

그러나 통역사가 매번 주석을 메모리로 읽어야 하는 경우가 없다면 이는 직관에 반하는 것처럼 보입니다.

도움이 되었습니까?

해결책

Perl은 정시에 편집 된 언어이므로 주석과 POD는 런타임 성능에 영향을 미치지 않습니다.

댓글과 포드는 컴파일 타임에 미미한 영향을 미치지 만 Perl이 구문 분석하기에 너무 쉽고 빠릅니다. 성능 히트를 측정하는 것은 거의 불가능합니다. 당신은 이것을 사용하여 직접 볼 수 있습니다 -c 단지 컴파일하는 플래그.

내 MacBook에서, 70 개의 문자 주석의 1000 줄과 1000 줄의 Perl 프로그램은 2 개의 인쇄문이있는 하나의 빈 댓글을 가진 1000 줄의 빈 댓글을 가진 하나로 컴파일하는 데 동시에 시간이 걸립니다. 각 벤치 마크를 실행하십시오 두 배 OS가 파일을 캐시하도록 허용하려면 벤치마킹중인 것은 디스크에서 파일을 읽을 시간입니다.

시작 시간이 문제라면 댓글과 포드 때문이 아닙니다.

다른 팁

런타임 성능? 아니.

구문 분석 및 렉싱 성능? 물론이죠.

Perl은 즉석에서 구문 분석하고 Lex를 사용하는 경향이 있으므로 주석은 "시작"성능에 영향을 미칩니다.

그들이 눈에 띄게 영향을 미칩니 까? 할 것 같지 않은.

Perl은 스크립트를 컴파일 한 다음 실행합니다. 주석은 컴파일 단계를 약간 느리게하지만 런 단계에는 0이됩니다.

Perl은 쉘 스크립트와 같은 의미의 스크립팅 언어가 아닙니다.인터프리터는 파일을 한 줄씩 읽지 않습니다.Perl 프로그램의 실행은 두 가지 기본 단계로 수행됩니다.컴파일 및 런타임 [1].컴파일 단계에서 소스 코드는 구문 분석되어 바이트코드로 변환됩니다.런타임 단계에서 바이트코드는 가상 머신에서 실행됩니다.

주석은 구문 분석 단계의 속도를 늦추지만 스크립트 자체를 구문 분석하는 데 필요한 시간(이미 대부분의 프로그램에서 매우 작음)에 비해 그 차이는 무시할 수 있습니다.구문 분석 시간에 대해 정말로 관심을 갖는 유일한 경우는 프로그램이 초당 여러 번 호출될 수 있는 웹 서버 환경입니다.mod_perl은 이 문제를 해결하기 위해 존재합니다.

당신은 사용하고 있습니다 Benchmark.좋아요!미세한 최적화가 아닌 알고리즘을 개선하는 방법을 찾아야 합니다.Devel::DProf는 핫스팟을 찾는 데 도움이 될 수 있습니다.당신은 절대적으로 해서는 안 된다 프로그램을 더 빠르게 만들기 위해 잘못된 시도로 주석을 제거하십시오.당신은 그것을 유지 관리할 수 없게 만들 것입니다.


[1] 이는 일반적으로 "적시" 컴파일이라고 합니다.Perl에는 실제로 다음과 같은 몇 가지 단계가 더 있습니다. INIT 그리고 END 여기서는 그게 중요하지 않아요.

요점은 : 병목 현상을 최적화합니다. 파일의 읽기는 다음으로 구성됩니다.

  • 파일 열기,
  • 내용을 읽고,
  • 파일을 닫고
  • 내용물을 구문 분석합니다.

이 단계 중에서 읽기가 가장 빠른 부분입니다 (폐쇄에 대해 잘 모르겠습니다. Syscall이지만 끝날 때까지 기다릴 필요는 없습니다). 그것이 모든 것의 10%이더라도 (그렇지 않다고 생각합니다), 반으로 줄이면 누락 된 의견 (매우 나쁜 것)의 비용으로 5% 만 개선 된 성능을 제공합니다. 파서의 경우 #로 시작하는 라인을 버리는 것은 실질적인 속도가 아닙니다. 그 후, 의견이 사라져서 속도가 느려질 수 없습니다.

이제 모든 의견을 제거함으로써 실제로 "스크립트의 읽기"부분을 5% 향상시킬 수 있다고 상상해보십시오 (실제로 낙관적 인 추정치, 위 참조). 스크립트의 전체 시간 소비에서 "스크립트의 읽기"의 비율은 얼마나 큰가요? 물론 그것이 얼마나 많은 일을하는지에 따라 다르지만 Perl 스크립트는 일반적으로 하나 이상의 파일을 읽기 때문에 최대 50%이지만 Perl 스크립트는 일반적으로 더 많은 것을 수행하기 때문에 정직한 추정치는 이것을 범위의 무언가로 끌어 올릴 것입니다. 1%. 따라서 모든 의견을 제거함으로써 예상 효율성 개선은 ~에 대부분 (매우 낙관적) 2.5%이지만 실제로 0.05%에 가깝습니다. 그리고 실제로 1% 이상을 제공하는 사람들은 거의 아무것도하지 않기 때문에 이미 빠르기 때문에 이미 잘못된 시점에서 최적화하고 있습니다.

결론, 병목 현상을 최적화합니다.

이 경우 벤치 마크 모듈은 쓸모가 없습니다. 코드를 반복해서 실행하는 것은 시간 만 측정하는 것입니다. 코드는 실제로 아무것도하지 않기 때문에 대부분 최적화됩니다. 그렇기 때문에 초당 2,200 만 배가 달리는 것을보고 있습니다.

나는 이것에 대한 거의 모든 장에 있습니다 마스터 링 Perl. 벤치 마크 기술에서 측정 오류는 약 7%입니다. 벤치 마크 번호는 그 안에 있으므로 거의 차이가 없습니다.

Paul Tomblins의 의견 :

Perl은 일종의 현대 편집을하지 않습니까? 아마도 댓글이 일찍 버려 졌을까요? -

예 Perl이합니다.

컴파일과 해석 사이의 프로그래밍 언어입니다. 코드가 즉석에서 컴파일 된 다음 실행됩니다. 의견은 일반적으로 아무런 차이를 만들지 않습니다. 아마도 가장 큰 영향은 아마도 파일을 라인별로 구문 분석하고 사전 컴파일 할 때 나노 두 번째 차이를 볼 수 있습니다.

나는 하나의 의견이 루프에서 여러 번만가 아니라 한 번만 구문 분석 될 것이라고 기대할 것이므로 유효한 테스트라고 의심합니다.

나는 의견이 약간 느리게 편집 될 것으로 기대하지만, 그것들을 제거하는 것이 너무 미미 할 것으로 기대합니다.

Perl 주석이 스크립트를 느리게합니까? 글쎄, 그것을 파싱, 그렇습니다. 구문 분석 후 실행? 아니요. 스크립트는 얼마나 자주 구문 분석됩니까? 한 번만, For Loop 내에 주석이있는 경우, 스크립트가 실행되기 전에 댓글은 한 번 구문 분석에 의해 폐기됩니다. 일단 실행되기 시작하면 주석이 이미 사라졌습니다 (그리고 스크립트는 내부적으로 스크립트로 저장되지 않습니다. Perl), 따라서 루프 반복의 몇 배에 관계없이 주석에는 영향을 미치지 않습니다. 파서는 댓글을 얼마나 빨리 건너 뛸 수 있습니까? Perl 댓글이 수행되는 방식은 매우 빠릅니다. 5 줄의 코드가 있고 각 줄 사이의 주석 라인 사이에 더 높은 시작 시간을 알 수 있습니다. 그러나 그 가능성은 얼마나 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top