여러 경로의 wc가 하나씩 실행하는 것보다 훨씬 빠른 이유는 무엇입니까?

여러 경로의 wc가 하나씩 실행하는 것보다 훨씬 빠른 이유는 무엇입니까?

여러 파일로 실행하는 것이 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_000m​​s=>[이메일 보호됨]wc) s 의 실제 계산과 관련이 없는 (거대한?) 시작 패널티가 있는 것 같습니다 \n.

관련 정보