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

本文关键字:函数 循环 性能 indexOf | 更新日期: 2023-09-27 18:20:23

我使用自定义indexOf函数编写了一个小程序,但我想放弃它,转而使用系统字符串。IndexOf()方法。

但在我开始重构之前,出于好奇,我写了一个小测试程序,看看我的函数与系统字符串相比有多糟糕。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;dr测试场景

首先,我设置了一些测试数据,用一些数据填充一个随机字符串

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:系统字符串。索引

然后检查系统字符串使用了多少刻度。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;

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

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

index = text.IndexOf('"'); 

你应该把测试重复几次。有时第一次运行需要更长的时间,因为方法被jit,或者因为静态成员被初始化等等。

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

我认为这里的区别在于,当您调用String.IndexOf时,您使用的是字符串文字,而您的自定义函数使用的是字符文字。

在没有看过您的自定义实现的情况下,我想String.IndexOf方法更正确(语言环境、unicode等等)。

不知道函数是如何工作的,可能会发生以下几件事:

1) 您正在寻找一个具有IndexAt与字符串查找的字符

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

3) 当然,并不是说该库针对每个解决方案都进行了优化,而且您可以很容易地更快地实现一些东西。只要看看LINQ,就会发现