실행 시퀀스(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나노초를 추가합니다. 이는 형식 지정과 관련된 모든 분기 및 복잡한 논리를 고려하면 의미가 있습니다.