여러 파일로 실행하는 것이 wc
파일별로 실행하는 것보다 훨씬 빠릅니다. 예를 들어:
> time git ls-files -z | xargs -0 wc -l > ../bach.x
real 0m2.765s
user 0m0.031s
sys 0m2.531s
> time git ls-files | xargs -I {} wc -l "{}" > ../onebyone.x
real 0m57.832s
user 0m0.156s
sys 0m3.031s
(저장소에는 ~10_000개의 파일이 포함되어 있으므로 xargs는 wc를 한 번이 아닌 여러 번 실행하지만 이 컨텍스트에서는 중요하지 않습니다.)
나는 wc
모든 파일을 열고 처리해야 하므로 속도 향상은 멀티스레딩을 통해서만 이루어져야 한다고 순진하게 생각했습니다. 그러나 여기에는 추가적인 파일 시스템 마법이 진행 중일 수도 있다는 내용을 읽었습니다.
여기에 세 파일 시스템의 마법이 있습니까, 아니면 모두 멀티스레드입니까, 아니면 다른 것입니까?
처벌 활성화
@muru의 의견에 따르면 a) 단일 실행에 약 8ms가 걸리고 b) wc
루프에서 실행하면 선형적으로 확장된다는 것을 알 수 있습니다.
> time wc -l ../x.x > /dev/null
real 0m0.008s
user 0m0.000s
sys 0m0.016s
> time for run in {1..10}; do wc -l ../x.x; done > /dev/null
real 0m0.076s
user 0m0.000s
sys 0m0.000s
> time for run in {1..100}; do wc -l ../x.x; done > /dev/null
real 0m0.689s
user 0m0.000s
sys 0m0.063s
파일당 여러 파일이 훨씬 빠르게 실행되므로(10_000f@3_000ms=>[이메일 보호됨]wc
) s 의 실제 계산과 관련이 없는 (거대한?) 시작 패널티가 있는 것 같습니다 \n
.