今天做專案時遇到乙個小需求:要將字串中的回車符號替換成其它符號(比如"
")。 考慮到不同的情況下,有些系統中是用\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,顏色設定成黑色。那要怎麼做?在這...