Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算大型.NET字符串中换行的最快方法是什么?_C#_.net - Fatal编程技术网

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

C# 计算大型.NET字符串中换行的最快方法是什么?,c#,.net,C#,.net,有没有办法改善这一点: 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; } private static int CountNewlines(字符串s) { int len=s.长度; int

有没有办法改善这一点:

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;
}
private static int CountNewlines(字符串s)
{
int len=s.长度;
int c=0;
对于(int i=0;i

我特别关心字符串上的项访问器。不确定它是否只是像C/C++那样的指针算法

这可能是最有效的选项-项访问器经过内部优化,您可以将其视为执行指针算术。

您可以使用“tocharray();”将字符串转换为字符数组,但我认为这不会提高性能。。您可以尝试使用不安全的代码(指针)而不是for,但这也有它的缺点。

我确信这不会比将字符串转换为字节并检查它们慢多少,如果不是更快的话。字符串类应该得到高度优化


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

如果在循环中使用它,则将其作为一个实例方法。

好吧,
string
实现
IEnumerable
,因此我一定会尝试:

s.Count( c => c == '\n' )
虽然看起来不错,但原始方法的速度快了30倍:)

我还没有放弃IEnumerable,所以我也尝试过:

int n = 0;
foreach( var c in s )
{
    if ( c == '\n' ) n++;
}
return n;

这似乎和原来的方法一样快

我测试了这些实现

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;
}
令人惊讶的是,对我来说,枚举器实现是最快的,比下一个最接近的实现快了20%。无论方法的运行顺序如何,结果都是可重复的。我还使用了预热阶段,以确保瞬态效应(jit等)被考虑在内


这是一个发布版本(/optimize+)

字符串来自哪里?我想既然你对性能很关心,那它是一个大字符串?如果这个大字符串来自文件或Web服务调用,那么问题应该是“计算流中换行数的最快方法”。将整个内容转换为字符串的原因将是昂贵的。顺便说一句,这可能真的是愚人节,不能再说了:-)我担心性能,因为#1,它可能很大(32k),而#2,它正在Windows窗体控件的OnPaint()方法中使用。哈宁,为什么这会是愚人节呢?这似乎是一个很好的基础问题。@Cheeso:只有在字符串变量被修改的情况下,才有办法计算换行符的计数,也没有办法缓存该结果,而不是重新计算每个绘图的值?并行执行只会在多核/多处理器机器上加快速度,但它确实是一种选择大字符串。当然,创建的线程数不应该超过内核总数。如果此字符串包含许多换行符,它可能只是一个非常大的文本文件或其他内容,因此OP实际上可能会使用此选项…例如在使用systemIO时,调用file.Copy和new FileInfo。复制()。这是O'Reilly C#Cookbook写的没错,我可以做到。我还没试过。这是一个大字符串,它会被重复调用,所以我倾向于避免创建新的数组只是为了计算它。这会在同一个字符串上被多次调用吗?你可以有一个以a weakreference为键,以int为结果的口述。这样您就可以缓存结果。。
              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