我正在学习 GNU 并行并尝试了以下操作:
$ for i in {1.txt,2.txt}; do time wc -l $i; done
100 1.txt
real 0m0.010s
user 0m0.000s
sys 0m0.010s
10000012 2.txt
real 0m0.069s
user 0m0.050s
sys 0m0.018s
Run Code Online (Sandbox Code Playgroud)
然后我用 重新运行上述命令parallel,但它减慢了速度。为什么?
$ for i in {1.txt,2.txt}; do time parallel --nonall wc -l $i; done
100 1.txt
real 0m0.325s
user 0m0.192s
sys 0m0.042s
10000012 2.txt
real 0m0.305s
user 0m0.220s
sys 0m0.043s
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您是从 for 循环中调用它的,因此您并没有真正并行运行任何东西。您所做的只是在第二个示例中添加调用 parallel 的开销,但它仍然仅以单一方式运行文件。
这可能会帮助您了解正在发生的事情。
无平行
$ time for i in {1..2}; do sleep 2;done
real 0m4.004s
user 0m0.001s
sys 0m0.002s
Run Code Online (Sandbox Code Playgroud)
与平行
$ time for i in {1..2}; do parallel "sleep 2" < /dev/null;done
real 0m4.574s
user 0m0.245s
sys 0m0.089s
Run Code Online (Sandbox Code Playgroud)
你可以这样调用parallel。
$ time parallel --gnu time wc -l ::: 1.txt 2.txt
real 0m0.007s
user 0m0.001s
sys 0m0.000s
1000 1.txt
real 0m0.003s
user 0m0.000s
sys 0m0.001s
1000 2.txt
real 0m0.207s
user 0m0.120s
sys 0m0.052s
Run Code Online (Sandbox Code Playgroud)
在这里,我们可以看到必须调用`parallel 和第三个时间分组显示运行整个并行命令所花费的“总”时间量是有开销的。