Bash
為什麼這種帶有“detex”的“無用的貓”比其他方法快 10 倍?
我正在計算 LaTeX 文件中的單詞並直覺地使用了以下命令:
$ cat *tex | detex | wc -w
然後我立即註意到他沒用
cat
,並再次使用:$ detex *tex | wc -w
我為自己避免了額外的過程而感到自豪,我想檢查一下不使用
cat
. 然後我很驚訝地看到這個版本實際上快了cat
10 倍:$ time cat *tex | detex | wc -w 5000 real 0m0.013s user 0m0.005s sys 0m0.007s
$ time detex *tex | wc -w 5000 real 0m0.144s user 0m0.124s sys 0m0.014s
這種巨大的速度差異的原因是什麼?從磁碟讀取文件的速度是否
cat
比 快得多detex
?我生成了 5 個用於基準測試的範例“LaTeX”文件:
$ for i in {1..5}; do shuf -n 1000 /usr/share/dict/words > "file${i}.tex"; done
最初的結果似乎只是不一致。
detex
從Homebrew安裝最新版本:$ detex -v OpenDetex version 2.8.9 https://github.com/pkubowicz/opendetex
得到一個範例 LaTeX 文件:
$ curl https://raw.githubusercontent.com/latex3/latex3/main/articles/2011-current-state.tex > file.tex
製作了 100 個文件副本:
$ for i in {1..100}; do cp file.tex "file${i}.tex"; done
執行
cat
版本 5 次:$ for i in {1..5}; do time cat *tex | detex | wc -w; done 78174 real 0m0.024s user 0m0.025s sys 0m0.012s 78174 real 0m0.021s user 0m0.023s sys 0m0.009s 78174 real 0m0.019s user 0m0.020s sys 0m0.008s 78174 real 0m0.019s user 0m0.019s sys 0m0.008s 78174 real 0m0.017s user 0m0.018s sys 0m0.008s
執行非
cat
版本 5 次:$ for i in {1..5}; do time detex *tex | wc -w; done 78174 real 0m0.027s user 0m0.023s sys 0m0.009s 78174 real 0m0.024s user 0m0.021s sys 0m0.007s 78174 real 0m0.021s user 0m0.020s sys 0m0.005s 78174 real 0m0.019s user 0m0.017s sys 0m0.005s 78174 real 0m0.018s user 0m0.016s sys 0m0.005s