2010-04-05 22 views
6

在寫一個腳本引擎,我有一個像(僞代碼)正則表達式與手動比較。哪個更快?

function is_whitespace?(char c){ 
    return c==' ' || c=='\t' || c=='\r' || c=='\n'; 
} 

好,我的問題是,這是最langugaes更快的功能呢?這或使用正則表達式像

function is_whitespace?(char c){ 
    return regex_match('\s',c); 
} 

的主要語言,我關心的是C#,C和Ruby也情況下,完全依賴於平臺的。

+2

似乎很簡單,掀起一個快速測試找出。生成一個充滿隨機字符的文件,並通過這兩個函數傳遞它。 – 2010-04-05 18:45:55

+0

我想你的意思是'\ s',而不是'\ w'。 – sepp2k 2010-04-05 18:46:56

+0

是啊,多數民衆贊成在真正..單聲道將不得不足以進行C#測試雖然.. – Earlz 2010-04-05 18:47:13

回答

11

當然,比構建,運行和銷燬狀態機,小塊內存的四次比較要快得多(並且幾乎不使用內存)。

+0

+1。請注意,更復雜的示例可能會更快地使用正則表達式。 – 2010-04-05 18:47:22

+0

那麼,正則表達式何時擊敗(天真)手動比較呢? – Earlz 2010-04-05 18:47:31

+3

我的猜測永遠不會,但是與編寫正則表達式相比,爲常規語言手動編碼匹配器可能會變得非常複雜。 – danben 2010-04-05 18:49:32

1

在大多數情況下,查找類似於空白字符的正則表達式非常快。在主要的正則表達式實現中,你有很多眼球看性能,並且在你的代碼的其他領域可能還有其他領域的「低掛水果」來優化。

正則表達式的不良表現是一個寫得很差的正則表達式。提示是儘可能避免不必要的回溯,分組和變更。使用諸如「Regex Buddy」或Perl之類的「use re debug」來查看正則表達式需要多少分支。

鏈接是一些正則表現問題。

如有疑問,做比較定時...

Coding Horor- Regex

Java Performance - Regex

3

手動比較是更快地執行,正則表達式相比較更快打字。

請注意,如果您的系統使用Unicode,那麼您的兩個實現不等效。正則表達式\s匹配所有的Unicode空格,而您的手動比較只處理基本的ASCII,甚至不包括垂直選項卡和通常也被認爲是空白的換頁字符。

如果你是用高級語言編寫的,我建議使用你的編程語言庫提供的is_whitespace()函數。像這樣的基本功能幾乎總是包含在內。

所以最後答案是「這要看情況」。在某些情況下,使用程序代碼的額外編程工作是有保證的。在很多情況下,正則表達式足夠快並且易於維護。

+0

儘管如此,如果你的Regex實現是unicode意識的,那麼這不是依賴嗎? (和你的語言,例如,我認爲Ruby仍然不是Unicode的) – Earlz 2010-04-06 15:10:54

+0

我說:「如果你的系統使用Unicode」。我的意思是編程語言和正則表達式。 Ruby 1.8中的正則表達式不支持Unicode,這是Ruby 1.9中的一種。 – 2010-04-08 02:32:15

1

磁盤使用後,正則表達式幾乎總是我的性能瓶頸時,我剖析我的代碼。即使是簡單的東西,如.split(「」)。

0

我不能說C#或C,但我不會認爲非正則表達式在Ruby中更快。