忽略字串大小寫替換的更高效實現

2021-09-22 13:13:52 字數 3036 閱讀 1233

昨天靈感兄的一篇文章,其中仔細的比較了在.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 原始...