2011-02-26 15 views
4

我找不到任何關於此主題的內容,所以我想知道是否有人比較了不同語言之間正則表達式匹配的速度。我想知道哪種語言能夠更快地執行正則表達式評估,因爲在我目前的項目中,我需要不斷地評估大量的正則表達式。語言的選擇將主要基於這種表現。語言或庫之間的正則表達式

我的想法是C/C++自然會更快,但如果可能的話我想避免它,而且我不確定我是否正確。例如,一個C#庫可能會使用P/Invoke的本地代碼,因此速度差異可能很荒謬。但我不知道要選擇什麼庫,或者如果我需要圍繞C++庫(哪個?)創建一個包裝器。

回答

4

什麼的正則表達式?他們會使用像lookaheads,lookbehinds,反向引用,不情願的量詞,原子組,佔有量詞等等的功能嗎?

其他反應已經鏈接到regex-dna benchmark,但只使用由所有正則表達式的口味共享最基本的功能,如克林星(*)和交替(|)。所以,儘管GNU C/C++實現似乎是明顯的贏家,但如果您需要上面列出的任何功能,它們不會對您有所幫助。

另一個考慮因素是Unicode支持。如果您正在處理實際文本(而不是數據以文本形式表示,例如regex-dna基準測試),則應使用具有良好Unicode支持的正則表達式。

我建議你看看C#。 .NET正則表達式的味道沒有緩慢的聲譽(這是關於正則表達式速度IMO的唯一明智的事情),而對於性能關鍵的應用程序,它提供了compiling directly to byte code的選項,可顯着提高性能。

+0

嗯,艾倫......但我想你說過「你應該使用一個好的Unicode支持的正則表達式。」你的具體的建議與此相反。因此,我建議您推薦與C♯不同的語言或圖書館,或者撤回該特定標準 - 我非常同意這一標準,ʙᴛᴡ。請不要讓我告訴你:你知道我可以。 ☺備案時,我認爲UTS#18級別1的支持僅夠用,2級爲好,3級爲優秀。低於1級,它甚至不僅僅是考慮因素。 – tchrist 2011-02-27 03:06:42

+0

@tchrist:是的,我認爲「良好的Unicode支持」誇大了情況,但AFAIK .NET沒有像Java那樣被破壞 - 例如'\ b \ w + \ b'匹配您的''評論。我開始推薦Perl,但由於OP在問題中提到了C#,我推斷他至少熟悉那種語言 - 另一個重要的考慮因素,@Lada。還有那個'Compiled'選項,在這種情況下似乎很合適 - 事實上,'CompileToAssembly()'甚至可能是有用的。 – 2011-02-28 00:15:34

0

我會建議在RegExBuddy中評估一個複雜的正則表達式。
嘗試使用您想要測試的語言。它以毫秒爲單位顯示速度。相信我,這是一個很棒的工具。

+3

雖然它是一個很好的工具,但它不適合比較一種正則表達式與另一種正則表達式的速度。 – 2011-02-26 13:27:59

3

有一個正則表達式的基準位置:http://shootout.alioth.debian.org/u64q/benchmark.php?test=regexdna&lang=all&box=1

但類型正則表達式的你將要使用可能問題很多比你所選擇的發動機的更多。有些發動機做的比別人對於某些類型的好,有些類型的正則表達式的緩慢無論什麼引擎(如某些正則表達式可以必要指數時間)

+0

注意:對於[x86單核](http://shootout.alioth.debian.org/u32/performance.php?test=regexdna)的更多語言實現,有基準遊戲測量結果,而不是x64四核。 – igouy 2011-02-26 16:44:13

+0

鏈接已經更改爲http://benchmarksgame.alioth.debian.org/u64q/performance.php?test=regexdna – 2017-01-10 16:41:38

0

語言的選擇將是 主要是基於這樣的表現。

然後您的選擇可能會下降到choice of regex engine

您的程序是運行在單核機器上還是多核心上,還是x86或x64?