2010-02-13 32 views
4

我有處理記住的是:Perl會成爲這種圖像處理的瓶頸嗎?

  • 有成千上萬的PNG文件
  • 他們每個人應該被加載,並且其像素訪問
  • 每個像素的通道會以某種方式進行處理,然後寫入一個二進制文件

我正在考慮使用某種模塊,如ImageMagick包裝,或其他包裝的C圖像處理後端。如果我選擇它來實現這個任務,Perl會減慢我的速度嗎?我已經有一個用Java編寫的工具(它使用JDK的BufferedImage),而且速度相當快。我會期待Perl的速度如此瘋狂嗎?

回答

9

如果您使用ImageMagick或其他任何基於C的處理工具,那麼perl肯定不會成爲瓶頸。我能看到的瓶頸(特別是如果處理成千上萬的文件)將是:

  • 磁盤IO速度
  • 內存訪問速度
  • 庫算法速度

Perl會爲一個偉大的膠水做你想做的事。緩慢的部分仍然會很慢。您也可以使快速部件變得簡單。 :)

此外,請記住優化的兩個規則:

  1. 不要這樣做。
  2. (僅適用於專家:)不要這樣做。

當你把它放在一起時,運行一個分析器。如果當變成你的目標,請上網:

http://metacpan.org/pod/Devel::NYTProf

傑韋利:: NYTProf幾乎是蜜蜂的膝蓋,當涉及到分析工具。它會告訴你到底你放慢的速度,所以你不會有一種「溫暖的模糊」的感覺,你確實是對的......你一定會知道的。

4

我不這麼認爲,除非你的Perl代碼過度依賴於緊密循環中的方法調用。 但是,如果實際的圖像處理是在C後端完成的,Perl不會成爲性能瓶頸。

+0

唯一的C後端將是由模塊的API公開的。我並不打算自己寫C :) – Geo 2010-02-13 21:20:49

+0

@Geo:我懷疑被稱爲「C後端」的DVK是「ImageMagick ...或其他C圖像處理後端的包裝器」。實際的圖像處理將由ImageMagick(或任何其他圖形庫)處理,並且可能是該操作中最耗時的部分,因此使用何種語言調用該庫並不重要。 – 2010-02-14 10:50:43

+0

@Dave - 是的,這就是我的意思 – DVK 2010-02-14 14:35:49

3

答案取決於什麼限制了Java版本的性能。如果你受限於文件I/O(包括.png解壓縮),那麼轉移到Perl可能會很好。否則,你可能會爲在Perl中處理每個像素付出巨大的性能損失,但如果你可以調用C例程來處理整個圖像,那麼你很可能會更快(可能更快,取決於相對性能C和Java庫)。

因此,簡而言之:如果Perl必須接觸像素,它會很慢。如果Perl接觸圖像並且C接觸像素,那很可能是好的。

1

是的,我預計perl實現的性能對於像素級圖像處理來說是非常令人厭惡的。

是的,你可以做到,但Perl的數據結構不適合這種事情。如果您使用的庫不需要每個像素進行1次調用,那麼您會很好。

+0

我需要在每個X,Y位置獲取像素,然後使用Perl代碼(簡單字節提取)處理它。 – Geo 2010-02-15 14:37:37

+0

您可能想要將圖像放入單個perl標量中的原始位圖 - 然後使用切片獲取適當的字節。這會吸引人,但不如使用Perl數組。處理大量大圖片的速度仍然很慢 - 至少比像Java這樣能夠正確優化字節數組上的代碼慢得多的速度(我想象的那樣) - 假設你有加載/保存到PNG的庫或者隨你。 – MarkR 2010-02-15 22:41:16