我有一个相当简单的字符串扩展方法,它在我所做的很多字符串操作的系统中经常被调用.我读了这篇文章(String.Substring()似乎是这个代码的瓶颈)并且认为我会尝试相同的方法,看看我是否可以通过改变我读取字符串的方式来找到一些性能.我的结果并不是我所期待的(我期待ReadOnlySpan提供显着的性能提升),我想知道为什么会这样.在我的实际运行代码中,我发现性能略有下降.
我使用我关心的字符生成了一个包含~115万行字符串的文件,在每个字符串上调用方法,并将结果转储到控制台.
我的结果(以毫秒为单位的运行时间)是:
ReadOnlySpan.IndexOf Framework 4.7.1: 68538
ReadOnlySpan.IndexOf Core 2.1: 64486
ReadOnlySpan.SequenceEqual Framework 4.7.1: 63650
ReadOnlySpan.SequenceEqual Core 2.1: 65071
substring Framework 4.7.1: 63508
substring Core 2.1: 64125
Run Code Online (Sandbox Code Playgroud)
代码(从完整框架到核心2.1完全相同):
调用代码:
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
var f = File.ReadAllLines("periods.CSV");
foreach (string s in f)
{ Console.WriteLine(s.CountOccurrences(".")); }
sw.Stop();
Console.WriteLine("Done in " + sw.ElapsedMilliseconds + " ms");
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
我方法的原始子串形式:
public static int CountOccurrencesSub(this string val, string searchFor)
{
if (string.IsNullOrEmpty(val) || string.IsNullOrEmpty(searchFor))
{ …Run Code Online (Sandbox Code Playgroud)