为什么“LC_ALL = C”无法加速“bzgrep”

时间:2017-06-07 02:36:52

标签: grep

就仅涵盖ASCII的案例而言,我们可以使用LC_ALL=C来显着加快grep程序。 由于bzgrepgrep很相似,我也尝试采用此方法。事实证明它没有多大帮助。 我使用的命令行如下所示:

$ time bzgrep Debug 001.log.bz2 | sed -n '/^09:00/ , /^09:30/p' | grep "Pattern1.*Pattern2" > /dev/null
$ time LC_ALL=C bzgrep Debug 001.log.bz2 | sed -n '/^09:00/ , /^09:30/p' | grep "Pattern1.*Pattern2" > /dev/null

更新:

$ time bzgrep

real    1m51.686s
user    1m52.310s
sys     0m6.682s

$ time LC_ALL=C bzgrep
real    1m51.835s
user    1m52.455s
sys     0m6.738s

$ time grep

real    1m9.553s
user    1m3.189s
sys     0m2.120s

$ time LC_ALL grep

real    0m4.136s
user    0m3.187s
sys     0m0.946s

1 个答案:

答案 0 :(得分:0)

假设bzgrep并不完全忽略LC_ALL,你可能会看到一个性能瓶颈,其中解压缩性能限制了实际grep代码首先获取数据的速度,从而提高了速度实际的grep代码很大程度上没有实际意义。

使用汽车类比,想象一下你有两组洗车机 - 一组可以在一分钟内洗车,另一组需要五分钟。你有十辆车要洗。第一支队伍在十分钟内洗了十辆车;另一支队伍在50分钟内洗了十辆车。

现在假设你有一个消防队员谁不喜欢同时拥有该物业上的那么多车并且决定通过允许一辆车进入洗车来解决问题,恰好在每个人的顶部小时。因此,每个团队完成其汽车,然后等待55或59分钟为下一个。

在那种情况下,第一个团队得到一辆汽车并在一分钟内洗一次,等待一个小时,再洗一辆汽车等等。他们开始洗第一辆汽车后9小时开始冲洗,所以需要9个小时总共一分钟。第二个团队做了同样的事情,但需要五分钟才能清洗最后一辆车,所以总共需要9小时5分钟。

以同样的方式,如果grep部分比解压缩部分快得多,那么假设你有一个多核CPU,总时间只取决于解压缩数据所需的时间加上最后一次grep的时间。大块数据。