据我了解,为获得所需输出而执行的命令越多,执行时间就越长。
让我们看一下:
time find /opt/platforms/ -name '*trading*cfg' | xargs grep SenderCompID | awk -F= '{print $2};
real 0m0.008s
user 0m0.000s
sys 0m0.000s
这是一个很好的执行时间。
我美化了这句丑陋的台词:
time find /opt/platforms/ -name '*trading*cfg' -exec grep SenderCompID {} \; | awk -F= '{print $2}'
real 0m0.076s
user 0m0.004s
sys 0m0.008s
即使我减少了一根管子并使用了find -exec
,时间还是长了一点。
我更进一步,只使用 find,没有任何管道:
time find /opt/platforms/ -name '*trading*cfg' -exec sed -n '/SenderCompID/s/.*=\(.*\)/\1/p' {} \;
real 0m0.076s
user 0m0.008s
sys 0m0.012s
“更糟糕”的结果。
假设我在一个已安装的网络设备中,这可能是时间的 10 倍,并且微小的差异将是显着的。
有人可以解释一下看似更有效的命令如何花费最长的执行时间吗?谢谢
答案1
你的“美化”使执行时间变得更糟。该程序xargs
将调用grep
多个文件,同时-exec
将调用grep
每个文件(您可以验证是否将其替换grep
为echo
)。如果grep
每次调用期间可以处理多个文件,则调用次数会更少(不需要启动,没有调用开销)。如果您调用sed
而不是 ,则同样成立grep
。