indexOf()的性能与函数循环做同样的事情

时间:2012-01-16 20:29:27

标签: c# .net performance

我使用自定义indexOf函数编写了一个小程序,但想要将其解除,而采用系统string.IndexOf()方法。

但是在我开始重构之前,我出于好奇而编写了一个小测试程序,看看我的函数在系统字符串中的表现有多糟糕.IndexOf()

我观察到的事实是系统string.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 = "abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ0123456789";
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

然后检查系统字符串使用了多少个刻度.IndexOf()

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

方法2:自定义方法

然后我运行我的自定义代码,这只是一个静态函数,while循环迭代字符数组。

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

3 个答案:

答案 0 :(得分:6)

String.IndexOf也有一个重载,接受char作为参数。试试这个吧。您自己的实现显然使用char而不是string

index = text.IndexOf('"'); 

您应该多次重复测试。有时第一次运行需要更长时间,因为方法是jitted或者因为静态成员被初始化或类似的东西。

Test1();
Test2();
// start time
for (i = 0; i < 100; i++) {
    Test1();
    Test2();
}
// stop time

答案 1 :(得分:5)

我认为这里的不同之处在于,当您调用String.IndexOf时,您正在使用字符串文字,而您的自定义函数正在使用字符文字。

如果没有看到您的自定义实现,我猜测String.IndexOf方法更正确(语言环境,unicode和所有这些)。

答案 2 :(得分:1)

不知道你的功能如何运作,可能会有几件事情发生:

1)您正在寻找具有IndexAt与String查找的字符

2)要进行更准确的比较,请将您的搜索词放在随机位置,并对每个位置执行几十次迭代。你的胜利可能是最糟糕的情况,但图书馆在剩下的时间里赢了

3)当然,没有任何迹象表明该库已针对每个解决方案进行了优化,您可以非常轻松地更快地实现某些功能。只需看看LINQ即可看到