昨天靈感兄的一篇文章,其中仔細的比較了在.net中做忽略字串大小寫替換的問題。並且給出了5個現有的解決方案,和詳細的效率測試資料。不過仔細看完後,我對於microsoft visualbasic runtime中的string.replace的效率不敢苟同,特別是看過c#改寫的**後,更是疑竇叢生
覺得vbstring.replace()效率有問題的主要原因是,split()再join()這個操作會帶來大量的string碎片,這對於託管系統來說,代價是很大的。而且字串中替換頻率越高,對效能的損耗也就越是明顯,後面的測試示例中我們會看到這個問題的。所以我實現的這個replaceex()出發點就是避免產生string碎片,同時實現**也不複雜,如下:
static
string replaceex(
string original,
string pattern,
string replacement)
return original;
int i=position0 ; i
newstring(chars, 0, count);
只有18行**,要說複雜大家也不會同意吧
為了省事,直接用靈感兄的測試**了他的test case是:"要把字串"中華abc共和國"中的"abc"替換為"人民",注意:源子字串是"abc",要替換的是"abc",這裡目的是要測試不區分大小寫。為了測試效率,我特意先把測試字串累加1000次,然後迴圈測試1000次。"。
測試資料如下:
regexp
vbvbreplace
replaceex
replace
= 2.05845295980355s
= 0.684810220293361s
= 0.679955692692786s
= 0.535100131441287s fastest!
= 0.0564451627231953s (直接用的string.replace(),僅做參考用)
// .net framework 1.1, windows xp sp2 en, p4 2.4g 512m.
由於substring和substringb太慢了,我都沒有耐心等待其結果了,故取消了對他們的測試。前面我提到說,如果被替換字串的替換頻率增大,vb和vbreplace這兩個方法的開銷也會急劇增大。下面看我的測試資料,不改變測試程式的迴圈次數,只修改:string segment = "中華abc共和國";一句話。 1、
string segment = "中abc華abc共和國";
regexp
vbvbreplace
replaceex
replace
= 3.75481827997692s
= 1.52745502570857s
= 1.46234256029747s
= 0.797071415501132s !!!
= 0.178327413120941s
// replaceex > vbreplace > vb > regexp 2、
string segment = "中abc華abc共abc和國";
regexp
vbvbreplace
replaceex
replace
= 5.30117431126023s
= 2.46258449048692s
= 2.5018721653171s
= 1.00662179131705s !!!
= 0.233760994763301s
// replaceex > vb > vbreplace > regexp 3、
string segment = "中abc華abc共abc和abc國";
regexp
vbvbreplace
replaceex
replace
= 7.00987862982586s
= 3.61050301085753s
= 3.42324876485699s
= 1.14969947297771s !!!
= 0.277254511397398s
// replaceex > vbreplace > vb > regexp 4、
string segment = "abcabcabcabcabcabcabcabcabc";
regexp
vbvbreplace
replaceex
replace
= 13.5940090151123s
= 11.6806222578568s
= 11.1757614445411s
= 1.70264153684337s !!!(壓倒優勢)
= 0.42236820601501s
// replaceex > vbreplace > vb > regexp
看到這裡,是不是覺得replaceex就是無敵的快了呢?其實我也希望是,不過在極端的情況下,就是segment中沒有可以替換的pattern時,replaceex就不行了:( 5、
string segment = "aabbcc";
regexp
vbvbreplace
replaceex
replace
= 0.671307945562914s
= 0.32356849823092s
= 0.316965703741677s !!!
= 0.418256510254795s
= 0.0453026851178013s
// vbreplace > vb > replaceex > regexp
在第5個測試中,replaceex效率不高的原因是,其所有消耗都耗費在了這兩個語句上:
如果我們使用compareinfo和compareoptions來進行indexof操作,雖然可以避免對字串進行case轉換,但是除測試5中的極端情況外,其他情況下效率都低於replaceex目前的實現。
歡迎您測試執行效率,並提供更優化方案:)
btw: 記錄測試資料不用多次平均,但最好不要使用第一次編譯後的執行結果。
字元替換 密碼翻譯 忽略大小寫比較字串大小
字元替換 描述把乙個字串中特定的字元全部用給定的字元替換,得到乙個新的字串。輸入只有一行,由乙個字串和兩個字元組成,中間用單個空格隔開。字串是待替換的字串,字串長度小於等於30個字元,且不含空格等空白符 接下來乙個字元為需要被替換的特定字元 接下來乙個字元為用於替換的給定字元。輸出一行,即替換後的字...
忽略大小寫,比較字串大小。
忽略大小寫比較字串大小 time limit 1000ms memory limit 65536k total submit 1021 accepted 151 description 一般我們用strcmp 可比較兩個字串的大小,比較方法為對兩個字串從前往後逐個字元相比較 按 ascii 碼值大小...
比較字串(忽略空格,忽略大小寫)
總時間限制 1000ms 記憶體限制 65536kb 描述判斷兩個由大小寫字母和空格組成的字串在忽略大小寫,且忽略空格後是否相等。輸入兩行,每行包含乙個字串。輸出若兩個字串相等,輸出yes,否則輸出no。樣例輸入 a a bb bb ccc ccc aa bbbb cccccc樣例輸出 yes 原始...