2012-01-16 95 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(); 
} 
相关问题