2013-07-23 50 views
3

我對數據塊運行一系列正則表達式。我們最近從Activestate perl 5.8 32bit(我知道......非常老!)升級到perl 5.16 64bit。所有硬件保持不變(窗口)。從perl 5.8(32bit)升級到5.16(64bit) - 正則表現擊中

我們注意到性能問題,在我們的解析循環之前大約需要2.5秒,現在需要大約5秒。任何人都可以給我一個關於什麼會導致變化的暗示嗎?我期待性能有所提高,因爲我的理解是引擎已經有了很大的改進,任何有關我應該做的不同的文檔都將不勝感激。

+1

只是在沒有做任何處理的情況下讀取數據,看看有多大差異 – ysth

+1

我看過一些關於正則表達式的問題/評論,因爲更正確地實現unicode,Perl的「新版本」舊版本的Perl(或其他)。不知道那裏有多少真相,但也許你可以考慮一下。 – Qtax

回答

7

是的,在v8之後,正則表達式引擎大大改進。獨自一人在V10中,我們看到:

  • 模式遞歸
  • 命名捕獲
  • 佔有慾量詞
  • 原路返回控制動詞,如(*FAIL)(*SKIP)
  • \K操作
  • ......以及一些更

此外,越來越多的內部作了Unicode感知的。

在第12版中,Unicode支持已清理完畢。正則表達式中的\p\X運算符現在大大增強了。

在第14版中,Unicode支持被碰撞到了6.0。 \N運營商的姓名得到了改進(另請參閱charnames編譯指示)。新的字符模型可以將任何無符號整數視爲碼點。在正則表達式引擎,

  • 正則表達式現在可以隨身攜帶charclass將修飾符像/u/d/l/a/aa
  • 執行/r的非破壞性索賠。
  • RE引擎現在是可重入的,所以嵌入的代碼可以使用正則表達式。
  • \p已清理
  • 當需要切換到unicode語義時,regex編譯速度更快。

在v16中,perl幾乎支持Unicode 6.1。在正則表達式引擎中,

  • 效率\p特類增加了。
  • 修復了各種正則表達式錯誤(通常涉及不區分大小寫的匹配)。

顯然,並非所有這些功能都是以一定的價格出現的,但特別是Unicode意識使得內部結構更復雜,速度更慢。

你也不能放棄一手,說明腳本的執行時間從perl5 v8 x86增加到perl5 v16 x64;有太多的變量:

  • 都是用相同的標誌編譯的Perl?
    • 都是perls線程perls(禁用線程支持使其更快)
    • 你的整數有多大? 64位或32位?
    • 選擇了哪種編譯器優化?
  • 您以前的Perl是否有一些特定於發行版的修補程序?

基本上,你必須比較整個perl -V輸出。


如果您使用正則表達式達到性能上限,那麼它們可能是大量解析的錯誤工具。至少,您可以使用更新的功能優化正則表達式以消除一些回溯。

如果您解析代碼描述了(大約)上下文無關語言(即不使用(?{...})(?=...)或相關的正則表達式的功能),以及解析裝置做這樣的事情發生在樹上,然後Marpa::R2可能會大大加快速度。

+1

謝謝你。這是我們可以研究的一些項目的一個很好的總結,我真的很感激你花時間寫出來! – sniperd

0

如果你正在尋找更好的表現,你可能還想確保一個正則表達式是你想要的。您沒有指定您的系統正在使用哪種類型的正則表達式,但通常您可以使用內置函數替換正則表達式。

例子:

if (lc($name) eq 'bob') { $bob_count++ } #Faster 
if ($name =~ /^bob$/i) { $bob_count++ } #Slower 

my $sentiment = "I don't like beans."; 
substr($sentiment, 13, 5) = 'broccoli'; #Faster 
$sentiment = "I don't like beans."; 
$sentiment =~ s/beans/broccoli/;   #Slower 

這些例子,以及unpack,並index,可能不適用於你的代碼,但如果他們這樣做,你應該基準,看看他們是否有幫助與表現。

+0

我瞭解到perl升級後性能下降的問題。你的回答沒有提到任何可能在版本之間改變的東西。相反,您提供一般優化提示時幾乎沒有問題的關聯。 (你的替代例子甚至不等價,除非'$ sentiment'的內容在執行前已知,你可能意思是if(0 <=(my $ i = index $ sentiment,「beans」)){substr $ sentiment, $ i,長度「beans」,「brocolli」}') – amon

+0

我在兩行之間看了一下,看到無論減速的原因是什麼,問題提出者大概仍然會有性能問題。我的答案指出,有時性能問題可以通過消除正則表達式來解決。這與問題直接相關。我試圖清楚表明這些例子必須在特定的代碼上進行測試。所以,是的,他的代碼不太可能包含一個包含字符串「我不喜歡豆」的變量。我認爲這太明顯,不能提及。 – dms