为什么这种“无用地使用 cat”与“detex”比替代方案快 10 倍?

为什么这种“无用地使用 cat”与“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

答案1

初步结果似乎不一致。

安装了最新detex版本自制:

$ 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

相关内容