형식 문자열을 지정할 때 영향을 받는 시퀀스 성능

형식 문자열을 지정할 때 영향을 받는 시퀀스 성능

실행 시퀀스(GNU coreutils 8.21)이것은 내가 시도한 가능한 형식과 비교하여 형식 문자열을 지정하지 않고도 매우 빠르게 실행됩니다.

$ time seq 1e8 > /dev/null
seq 1e8 > /dev/null
0.68s user 0.02s system 99% cpu 0.703 total

$ time seq -f '%1.f' 1e8 > /dev/null                                                                                                                                                                                                          
seq -f '%1.f' 1e8 > /dev/null
53.82s user 0.03s system 99% cpu 53.875 total

여기서 무슨 일이 일어나고 있는 걸까요? 형식 문자열을 명시적으로 제공하면 성능이 재현됩니까?

답변1

이것은 매우 관찰적인 것이지만 실제로는 의미가 있습니다. 소스 코드는 다음과 같습니다.http://code.metager.de/source/xref/gnu/coreutils/src/seq.c

seq_fast먼저, 함수 및 호출 앞의 주석 에 주의하세요 .

608  /* If the following hold:
609     - no format string, [FIXME: relax this, eventually]
610     - integer start (or no start)
611     - integer end
612     - increment == 1 or not specified [FIXME: relax this, eventually]
613     then use the much more efficient integer-only code.  */

이러한 조건이 충족되면 더 나은 알고리즘이 있다는 것을 알 수 있습니다. 실제로 증분을 추가하면 다음을 print_numbers사용하는 대신 동일한 동작이 느려집니다 seq_fast.

time seq  1e9 > /dev/null 
seq 1e9 > /dev/null  4.68s user 0.09s system 99% cpu 4.770 total


time seq  1 7 1e9 > /dev/null
seq 1 7 1e9 > /dev/null  56.78s user 0.02s system 99% cpu 56.801 total

포맷 시간이 더 오래 걸리는 이유(1e9 대신 1e8을 사용하는 경우 1분)는 53/10^8초 = 530나노초입니다. 따라서 평균적으로 형식 코드(인쇄하기 전에 각 숫자에 대해 실행되어야 함)는 인쇄된 각 숫자에 약 530나노초를 추가합니다. 이는 형식 지정과 관련된 모든 분기 및 복잡한 논리를 고려하면 의미가 있습니다.

관련 정보