zeb*_*h49 5 linux performance terminal imagemagick parallel-processing
编辑:对于将来偶然发现这一点的任何人:Imagemagick 使用 MP 库。如果有可用的核心,那么使用它们会更快,但如果您有并行作业,那就没有帮助了。
执行以下操作之一:
通过让 Imagemagick 仅使用一个线程,它在我的测试用例中减慢了 20-30%,但这意味着我可以在每个核心上运行一项作业而不会出现问题,从而显着提高性能的净值。
在使用 ImageMagick 转换一些图像时,我注意到有些奇怪的效果。使用 xargs 比标准 for 循环慢得多。由于 xargs 仅限于单个进程,因此其行为应类似于 for 循环,因此我对此进行了测试,发现它大致相同。
于是,我们就有了这个演示。
结果:
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 1 convert -auto-level
real 0m3.784s
user 0m2.240s
sys 0m0.230s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 2 convert -auto-level
real 0m9.097s
user 0m28.020s
sys 0m0.910s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 10 convert -auto-level
real 0m9.844s
user 0m33.200s
sys 0m1.270s
Run Code Online (Sandbox Code Playgroud)
谁能想到为什么运行该程序的两个实例需要两倍以上的实时时间以及十倍以上的处理器时间来完成相同的任务?在最初的打击之后,更多的进程似乎没有那么显着的效果。
我认为这可能与磁盘查找有关,所以我完全在内存中进行了该测试。它是否与 Convert 的工作方式有关,并且一次拥有多个副本意味着它无法有效地使用处理器缓存或其他什么?
编辑:处理 1000x 769KB 文件时,性能符合预期。有趣的。
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 1 convert -auto-level
real 3m37.679s
user 5m6.980s
sys 0m6.340s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 1 convert -auto-level
real 3m37.152s
user 5m6.140s
sys 0m6.530s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 2 convert -auto-level
real 2m7.578s
user 5m35.410s
sys 0m6.050s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 4 convert -auto-level
real 1m36.959s
user 5m48.900s
sys 0m6.350s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 10 convert -auto-level
real 1m36.392s
user 5m54.840s
sys 0m5.650s
Run Code Online (Sandbox Code Playgroud)
与 L1 缓存相比,您希望转换的文件有多大?你的二级缓存?
如果没有更好地了解内部情况,我怀疑缓存争用会导致 CPU 在等待数据重新缓存时空闲,因为其他进程不断将重要的内容从快速内存中踢出。