我對數據塊運行一系列正則表達式。我們最近從Activestate perl 5.8 32bit(我知道......非常老!)升級到perl 5.16 64bit。所有硬件保持不變(窗口)。從perl 5.8(32bit)升級到5.16(64bit) - 正則表現擊中
我們注意到性能問題,在我們的解析循環之前大約需要2.5秒,現在需要大約5秒。任何人都可以給我一個關於什麼會導致變化的暗示嗎?我期待性能有所提高,因爲我的理解是引擎已經有了很大的改進,任何有關我應該做的不同的文檔都將不勝感激。
我對數據塊運行一系列正則表達式。我們最近從Activestate perl 5.8 32bit(我知道......非常老!)升級到perl 5.16 64bit。所有硬件保持不變(窗口)。從perl 5.8(32bit)升級到5.16(64bit) - 正則表現擊中
我們注意到性能問題,在我們的解析循環之前大約需要2.5秒,現在需要大約5秒。任何人都可以給我一個關於什麼會導致變化的暗示嗎?我期待性能有所提高,因爲我的理解是引擎已經有了很大的改進,任何有關我應該做的不同的文檔都將不勝感激。
是的,在v8之後,正則表達式引擎大大改進。獨自一人在V10中,我們看到:
(*FAIL)
或(*SKIP)
。\K
操作此外,越來越多的內部作了Unicode感知的。
在第12版中,Unicode支持已清理完畢。正則表達式中的\p
和\X
運算符現在大大增強了。
在第14版中,Unicode支持被碰撞到了6.0。 \N
運營商的姓名得到了改進(另請參閱charnames
編譯指示)。新的字符模型可以將任何無符號整數視爲碼點。在正則表達式引擎,
/u
,/d
,/l
,/a
,/aa
。/r
的非破壞性索賠。\p
已清理在v16中,perl幾乎支持Unicode 6.1。在正則表達式引擎中,
\p
特類增加了。顯然,並非所有這些功能都是以一定的價格出現的,但特別是Unicode意識使得內部結構更復雜,速度更慢。
你也不能放棄一手,說明腳本的執行時間從perl5 v8 x86增加到perl5 v16 x64;有太多的變量:
基本上,你必須比較整個perl -V
輸出。
如果您使用正則表達式達到性能上限,那麼它們可能是大量解析的錯誤工具。至少,您可以使用更新的功能優化正則表達式以消除一些回溯。
如果您解析代碼描述了(大約)上下文無關語言(即不使用(?{...})
,(?=...)
或相關的正則表達式的功能),以及解析裝置做這樣的事情發生在樹上,然後Marpa::R2可能會大大加快速度。
謝謝你。這是我們可以研究的一些項目的一個很好的總結,我真的很感激你花時間寫出來! – sniperd
如果你正在尋找更好的表現,你可能還想確保一個正則表達式是你想要的。您沒有指定您的系統正在使用哪種類型的正則表達式,但通常您可以使用內置函數替換正則表達式。
例子:
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
,可能不適用於你的代碼,但如果他們這樣做,你應該基準,看看他們是否有幫助與表現。
我瞭解到perl升級後性能下降的問題。你的回答沒有提到任何可能在版本之間改變的東西。相反,您提供一般優化提示時幾乎沒有問題的關聯。 (你的替代例子甚至不等價,除非'$ sentiment'的內容在執行前已知,你可能意思是if(0 <=(my $ i = index $ sentiment,「beans」)){substr $ sentiment, $ i,長度「beans」,「brocolli」}') – amon
我在兩行之間看了一下,看到無論減速的原因是什麼,問題提出者大概仍然會有性能問題。我的答案指出,有時性能問題可以通過消除正則表達式來解決。這與問題直接相關。我試圖清楚表明這些例子必須在特定的代碼上進行測試。所以,是的,他的代碼不太可能包含一個包含字符串「我不喜歡豆」的變量。我認爲這太明顯,不能提及。 – dms
只是在沒有做任何處理的情況下讀取數據,看看有多大差異 – ysth
我看過一些關於正則表達式的問題/評論,因爲更正確地實現unicode,Perl的「新版本」舊版本的Perl(或其他)。不知道那裏有多少真相,但也許你可以考慮一下。 – Qtax