Replace方法與正規表示式的效能比較

2022-01-31 14:38:37 字數 4738 閱讀 8121

今天做專案時遇到乙個小需求:要將字串中的回車符號替換成其它符號(比如"

")。 考慮到不同的情況下,有些系統中是用\r\n作回車符,有些僅用\n就代表回車符了。以前都是用string類的replace方法連線替換多次來處理的,今天突然想改為正規表示式一次性搞定,但又怕效能上消耗太大,於是寫了下面的測試**:

using system;

using system.diagnostics;

console.write("\n次×輪測試,[replace]方法平均每輪速度:\n", count, times, result / times);

console.write("\n");

result = 0;

for (int i = 0; i < times; i++)

console.write("\n次×輪測試,[正規表示式]方法平均每輪速度:\n", count, times, result / times);

console.read();

}static string regreplace(string strsrc, string strregpattern, string strreplace)

static string replace(string strsrc)

static long test(stopwatch sw, int count, string a, bool useregularexpressions)

else

}sw.stop();

console.write(sw.elapsedmilliseconds + "\n");

return sw.elapsedmilliseconds;}}

}

輸出結果:

11111 * 22222 * 33333 * 44444 * 55555 * 66666

11111 * 22222 * 33333 * 44444 * 55555 * 66666

9489

8886

8350000次×5輪測試,[replace]方法平均每輪速度:88

333327

321327

33250000次×5輪測試,[正規表示式]方法平均每輪速度:328

可以看出,正規表示式要慢一倍都不止,大概慢 328/88 =3.7倍 (當然改變字串的長度以及回車符的數量與位置,結果又會有一些差異)

注:經 

edwin liu

在回覆中提醒,正規表示式編譯預熱後速度要快一點,今天把測試**改了下

using system;

using system.diagnostics;

using system.text.regularexpressions;

console.write("\n次×輪測試,[replace]方法平均每輪速度:\n", count, times, result / times);

console.write("\n");

result = 0;

for (int i = 0; i < times; i++)

console.write("\n次×輪測試,[正規表示式]方法平均每輪速度:\n", count, times, result / times);

console.read();

}static string replace(string strsrc)

static long test(stopwatch sw, int count, string a, bool useregularexpressions)

else

}sw.stop();

console.write(sw.elapsedmilliseconds + "\n");

return sw.elapsedmilliseconds;}}

}

新的測試結果:

11111 * 22222 * 33333 * 44444 * 55555 * 66666

11111 * 22222 * 33333 * 44444 * 55555 * 66666

10093

8686

8450000次×5輪測試,[replace]方法平均每輪速度:89

204200

201210

19050000次×5輪測試,[正規表示式]方法平均每輪速度:201

粗略比較一下:編譯預熱後 慢201/89=2.3倍,相當剛才的3.7倍確實有所提高,但是相對於string類的replace方法仍然可以認為很慢。(不過從方便程度上講,有些複雜的功能用正規表示式還是很方便的)

二、silverlight 4.0環境

注:silverlight中沒有stopwatch類,所以用datetime.now計時代替了,但這樣可能結果不太精確;另外silverlight中的正規表示式也沒有編譯預熱功能,所以只能用最原始的方法。

using system;

using system.diagnostics;

using system.windows;

using system.windows.controls;

using system.text.regularexpressions;

void mainpage_loaded(object sender, routedeventargs e)

debug.writeline("次×輪測試,[replace]方法平均每輪速度:\n", count, times, result / times);

result = 0;

for (int i = 0; i < times; i++)

debug.writeline("次×輪測試,[正規表示式]方法平均每輪速度:\n", count, times, result / times);

}string regreplace(string strsrc, string strregpattern, string strreplace)

string replace(string strsrc)

double test(int count, string a, bool useregularexpressions)

else

}datetime _end = datetime.now;

timespan span = _end - _start;

debug.writeline(span.totalmilliseconds);

return span.totalmilliseconds;}}

}

輸出結果:

11111 * 22222 * 33333 * 44444 * 55555 * 66666

11111 * 22222 * 33333 * 44444 * 55555 * 66666

78.0002

93.6001

93.6002

78.0001

93.6002

50000次×5輪測試,[replace]方法平均每輪速度:87.36016

405.6007

405.6007

483.6009

405.6007

405.6007

50000次×5輪測試,[正規表示式]方法平均每輪速度:421.20074

可以看出,基本上跟console程式在乙個數量級(因為底層的clr基本上是差不多的,這也符合預期,但貌似silverlight的正規表示式要慢一點,估計跟沒有編譯預熱功能有很大關係)

三、as3.0的測試

注:前幾天看到園子裡有高手說as3.0的效能大約是silverlight的80%,很是好奇,所以最後也順便放到as3.0中測試了一下,但要注意的是:因為actionscript3.0中string的replace方法跟js一樣,預設只能替換第一次找到的字串,所以基本上要實現全盤替換,只能用正規表示式

import flash.utils.timer;

function replace(strsrc:string):string

function test(strsrc:string,count:uint):int {

var i:uint=0;

var _start=gettimer();

for (i=0; i輸出結果:

11111 * 22222 * 33333 ** 44444 ** 55555 * 66666

1547

1508

1509

1515

1504

50000 次× 5 輪測試,[replace]方法平均每輪速度: 1516.6

但這個結果就很誇張了。

注:今天早上又測試了好幾把,好象結果又快了一點,估計是昨天測試的時候有些程式沒關

11111 * 22222 * 33333 ** 44444 ** 55555 * 66666

1048

1002

1001

1000

1009

50000 次× 5 輪測試,[replace]方法平均每輪速度: 1012

當然上面的示例中,加了gi標誌,即全域性查詢,並忽略大小寫,如果去掉大小寫標記,即var mypattern:regexp = /\r|\n/gi; 改成 var mypattern:regexp = /\r|\n/g; 速度能快一點

11111 * 22222 * 33333 ** 44444 ** 55555 * 66666

1015

971972

970971

50000 次× 5 輪測試,[replace]方法平均每輪速度: 979.8

正規表示式replace方法應用

一 replace方法介紹 replace方法使用表示式模式對字串執行搜尋,並對搜尋到的內容用指定的字串替換,返回乙個字串物件,包含了替換後的內容。語法 replace rgexp.replacetext replace方法執行後,將更新regexp物件中的有關靜態屬性以反映匹配情況。該方法需要兩個...

replace 結合正規表示式

為了簡化替換字串的操作,ecmscript提供了replace 方法,這個方法提供兩個引數,第乙個引數可以使乙個字串或regexp物件,第二個引數可以是乙個字串或者乙個函式。基礎知識 匹配整個模式的子字串。與regexp.lastmatch的值相同 匹配的子字串之前的字串,與regexp.leftc...

使用正規表示式Replace

使用regex.replace 方法可以剔除字串中的html 例如在text資料型別的資料庫字段,中存放的字串格式如下 一 學術研究課題 如果這段字串不經過處理顯示出來就是加粗的字型,如下 一 學術研究課題 如果現在想更改這個字串顯示的格式,將字型大小設定成13px,顏色設定成黑色。那要怎麼做?在這...