在大型.NET字符串中计算换行符的最快方法是什么?

Che*_*eso 15 .net c#

有没有办法改善这个:

private static int CountNewlines(string s)
{
    int len = s.Length;
    int c = 0;
    for (int i=0; i < len;  i++)
    {
        if (s[i] == '\n') c++;
    }
    return c;
}
Run Code Online (Sandbox Code Playgroud)

我特别关注字符串上的Item访问器.不确定它是否只是像C/C++这样的指针算法.

Che*_*eso 21

我测试了这些实现

private static int Count1(string s)
{
    int len = s.Length;
    int c = 0;
    for (int i=0; i < len;  i++)
    {
        if (s[i] == '\n') c++;
    }
    return c+1;
}

private static int Count2(string s)
{
    int count = -1;
    int index = -1;

    do
    {
        count++;
        index = s.IndexOf('\n', index + 1);
    }
    while (index != -1);

    return count+1;
}

private static int Count3(string s)
{
    return s.Count( c => c == '\n' ) + 1;
}


private static int Count4(string s)
{
    int n = 0;
    foreach( var c in s )
    {
        if ( c == '\n' ) n++;
    }
    return n+1;
}

private static int Count5(string s)
{
    var a = s.ToCharArray();
    int c = 0;
    for (int i=0; i < a.Length; i++)
    {
        if (a[i]=='\n') c++;
    }
    return c+1;
}
Run Code Online (Sandbox Code Playgroud)

这是我在~25k的字符串上进行100000次迭代的时序结果.越低越快.

              Time  Factor
Count1   4.8581503     1.4
Count2   4.1406059     1.2
Count3  45.3614124    13.4
Count4   3.3896130     1.0
Count5   5.9304543     1.7
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,对我来说,Enumerator实现对我来说是最快的,在很大程度上 - 比下一个最接近的实现快20%.无论方法的运行顺序如何,结果都是可重复的.我还使用了一个预热阶段来确保瞬态效应(jit等)被考虑在内.

这是发布版本(/ optimize +)


M.A*_*nin 6

我很确定这不会比将字符串转换为字节并检查它们(如果不是更快)慢得多.String类应该高度优化.

如果这是一个大字符串,可能由几个线程并行执行会使事情变得更快:-)