2012-01-16 56 views
2

我用一個自定義的indexOf函數編寫了一個小程序,但是希望關閉系統string.IndexOf()方法來解除它。indexOf()與函數循環做同樣的事情的性能

但在此之前,我開始重構我寫了一個小測試程序,出於好奇看到的只是看到我的功能是多麼糟糕系統string.IndexOf()的比較行爲

我觀察到的事實是,系統串.IndexOf 似乎是比迭代數組慢。

Processing random random string at 1000000 characters. 
Processing method 1 system string.IndexOf 
index 999999 took 620036 ticks 
Processing method 2 custom IndexOf 
index 999999 took 130007 ticks 

所以我的問題是真的; 我做錯了嗎?系統的運行速度不應該比我在c#中編寫的其他任何東西都快嗎?

TL;博士 測試場景

第一我建立一些測試數據,並填充在隨機字符串與一些數據

StringBuilder sb = new StringBuilder(); 
Random r = new Random(); 
string c = "abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ"; 
long before; 
long after; 
for (int i = 0; i < 1000000; i ++) sb.Append(c[r.Next(c.Length)]); 

,然後在端部插入的東西我想要搜索的陣列,最壞的情況

int j = sb.Length - 1 ;         
sb[j] = '"'; 

方法1:系統string.IndexOf

然後檢查多少蜱用於由系統string.IndexOf()

before = DateTime.Now.Ticks; 
index = text.IndexOf("\""); 
after = DateTime.Now.Ticks; 

方法2:定製方法

和後我運行我的自定義代碼,它只是一個靜態函數,帶有一個遍歷字符數組的循環。

before = DateTime.Now.Ticks; 
index = IndexOf(text, 0, '"', '/'); 
after = DateTime.Now.Ticks; 
+9

無論如何,這不是一個基準。 – delnan 2012-01-16 20:30:54

+8

首先,你應該使用'Stopwatch'作爲基準測試 - 它的分辨率比'DateTime'更好。 – Oded 2012-01-16 20:31:47

+0

你如何實現'IndexOf()'看起來? – Magnus 2012-01-16 20:39:44

回答

5

我認爲這裏的區別在於,當你打電話String.IndexOf您使用的是字符串文字,你的自定義函數使用字符文字。

沒有看到您的自定義實現,我猜String.IndexOf方法更加正確(locales,unicode,和所有東西)。

+0

從技術上講,它的語言環境不是本地的。我爲你解決了這個問題:) – 2012-01-16 20:34:24

1

不知道你的函數是如何工作的,可以有幾件事情怎麼回事:

1)您與IndexAt尋找一個字符VS字符串查找

2)做一個更精確的比較,把你的搜索詞放在randomm的位置,並執行每個的幾十次迭代。這可能是你贏的最糟糕的情況,但圖書館贏得了剩餘的時間

3)當然,沒有什麼可以說庫是針對每個解決方案進行優化的,而且你可以非常容易地實現更快的實現。只要看看LINQ看到

5

String.IndexOf也有一個超載,接受char作爲參數。試試這個。你自己的實現顯然使用char而不是string

index = text.IndexOf('"'); 

你應該重複測試幾次。有時第一次運行會花費更長的時間,因爲方法會出錯,或者因爲靜態成員被初始化或類似的東西。

for (i = 0; i < 10; i++) { 
    Test1(); 
    Test2(); 
} 
相關問題