댓글이 Perl 성능에 영향을 미치나요?
-
06-07-2019 - |
문제
나는 자주 실행되는 일부 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 줄의 코드가 있고 각 줄 사이의 주석 라인 사이에 더 높은 시작 시간을 알 수 있습니다. 그러나 그 가능성은 얼마나 될 것입니다.