EDIT: Gelecekte bunun üzerine tökezleyen herkes için: Imagemagick bir MP kütüphanesi kullanıyor. Etraflarındalarsa kullanılabilir çekirdekleri kullanmak daha hızlıdır, ancak paralel işleriniz varsa yararsızdır.
Aşağıdakilerden birini yapın:
- işlerinizi seri olarak yapın (Imagemagick ile paralel modda)
- Söz konusu imagemagick ikilisini çağırmanız için MAGICK_THREAD_LIMIT = 1 değerini ayarlayın.
Imagemagick'in yalnızca bir iş parçacığı kullanmasını sağlayarak, test durumlarımda% 20-30 oranında yavaşlıyor, ancak performansta önemli bir net artış için çekirdek başına bir iş yürütebileceğim anlamına geliyordu.
Orijinal soru:
ImageMagick kullanarak bazı görüntüleri dönüştürürken biraz garip bir etki fark ettim. Xargs kullanmak döngü için bir standarttan önemli ölçüde daha yavaştı. Tek bir işlemle sınırlı olan xargs bir for döngüsü gibi davranması gerektiğinden, bunu test ettim ve yaklaşık olarak aynı buldum.
Dolayısıyla bu gösterimiz var.
- Dört çekirdekli (AMD Athalon X4, 2.6GHz)
- Tamamen bir ibadet üzerinde çalışmak (toplam 16g ram; takas yok)
- Başka büyük yük yok
Sonuçlar:
/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
Bu programın iki örneğini çalıştırmanın, aynı görevi tamamlamak için gerçek zamanlı olarak iki kattan fazla, işlemci zamanında da on kattan uzun sürmesinin bir nedeni olabilir mi? Bu ilk vuruştan sonra, daha fazla işlemin bir etkisinin önemli olduğu görünmüyor.
Disk aramayla ilgili olabileceğini düşündüm, bu yüzden o testi tamamen koç olarak yaptım. Convert'ın nasıl çalıştığıyla ilgili bir şey olabilir mi ve aynı anda birden fazla kopyaya sahip olmak, işlemci önbelleğini verimli bir şekilde kullanamayacağı anlamına mı geliyor?
EDIT: 1000x 769KB dosya ile yapıldığında, performans beklendiği gibi. İlginç.
/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