我有處理記住的是:Perl會成爲這種圖像處理的瓶頸嗎?
- 有成千上萬的PNG文件
- 他們每個人應該被加載,並且其像素訪問
- 每個像素的通道會以某種方式進行處理,然後寫入一個二進制文件
我正在考慮使用某種模塊,如ImageMagick包裝,或其他包裝的C圖像處理後端。如果我選擇它來實現這個任務,Perl會減慢我的速度嗎?我已經有一個用Java編寫的工具(它使用JDK的BufferedImage),而且速度相當快。我會期待Perl的速度如此瘋狂嗎?
我有處理記住的是:Perl會成爲這種圖像處理的瓶頸嗎?
我正在考慮使用某種模塊,如ImageMagick包裝,或其他包裝的C圖像處理後端。如果我選擇它來實現這個任務,Perl會減慢我的速度嗎?我已經有一個用Java編寫的工具(它使用JDK的BufferedImage),而且速度相當快。我會期待Perl的速度如此瘋狂嗎?
如果您使用ImageMagick或其他任何基於C的處理工具,那麼perl肯定不會成爲瓶頸。我能看到的瓶頸(特別是如果處理成千上萬的文件)將是:
Perl會爲一個偉大的膠水做你想做的事。緩慢的部分仍然會很慢。您也可以使快速部件變得簡單。 :)
此外,請記住優化的兩個規則:
當你把它放在一起時,運行一個分析器。如果當變成你的目標,請上網:
http://metacpan.org/pod/Devel::NYTProf
傑韋利:: NYTProf幾乎是蜜蜂的膝蓋,當涉及到分析工具。它會告訴你到底你放慢的速度,所以你不會有一種「溫暖的模糊」的感覺,你確實是對的......你一定會知道的。
我不這麼認爲,除非你的Perl代碼過度依賴於緊密循環中的方法調用。 但是,如果實際的圖像處理是在C後端完成的,Perl不會成爲性能瓶頸。
答案取決於什麼限制了Java版本的性能。如果你受限於文件I/O(包括.png解壓縮),那麼轉移到Perl可能會很好。否則,你可能會爲在Perl中處理每個像素付出巨大的性能損失,但如果你可以調用C例程來處理整個圖像,那麼你很可能會更快(可能更快,取決於相對性能C和Java庫)。
因此,簡而言之:如果Perl必須接觸像素,它會很慢。如果Perl接觸圖像並且C接觸像素,那很可能是好的。
是的,我預計perl實現的性能對於像素級圖像處理來說是非常令人厭惡的。
是的,你可以做到,但Perl的數據結構不適合這種事情。如果您使用的庫不需要每個像素進行1次調用,那麼您會很好。
唯一的C後端將是由模塊的API公開的。我並不打算自己寫C :) – Geo 2010-02-13 21:20:49
@Geo:我懷疑被稱爲「C後端」的DVK是「ImageMagick ...或其他C圖像處理後端的包裝器」。實際的圖像處理將由ImageMagick(或任何其他圖形庫)處理,並且可能是該操作中最耗時的部分,因此使用何種語言調用該庫並不重要。 – 2010-02-14 10:50:43
@Dave - 是的,這就是我的意思 – DVK 2010-02-14 14:35:49