Bash

為什麼這種帶有“detex”的“無用的貓”比其他方法快 10 倍?

  • May 25, 2022

我正在計算 LaTeX 文件中的單詞並直覺地使用了以下命令:

$ cat *tex | detex | wc -w

然後我立即註意到他沒用cat,並再次使用:

$ detex *tex | wc -w

我為自己避免了額外的過程而感到自豪,我想檢查一下不使用cat. 然後我很驚訝地看到這個版本實際上快 cat10 倍:

$ 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

最初的結果似乎只是不一致。

detexHomebrew安裝最新版本:

$ 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

引用自:https://unix.stackexchange.com/questions/639274