如何快速计算线?

Jad*_*ias 30 c# streamreader wc

我尝试了unxutils ' wc -l但它崩溃了1GB文件.我试过这个C#代码

long count = 0;
using (StreamReader r = new StreamReader(f))
{
    string line;
    while ((line = r.ReadLine()) != null)
    {
        count++;
    }
}

return count;
Run Code Online (Sandbox Code Playgroud)

它在4秒内读取500MB文件

var size = 256;
var bytes = new byte[size];
var count = 0;
byte query = Convert.ToByte('\n');
using (var stream = File.OpenRead(file))
{
    int many;
    do
    {
        many = stream.Read(bytes, 0, size);
        count += bytes.Where(a => a == query).Count();                    
    } while (many == size);
}
Run Code Online (Sandbox Code Playgroud)

在10秒内读取

var count = 0;
int query = (int)Convert.ToByte('\n');
using (var stream = File.OpenRead(file))
{
    int current;
    do
    {
        current = stream.ReadByte();
        if (current == query)
        {
            count++;
            continue;
        }
    } while (current!= -1);
}
Run Code Online (Sandbox Code Playgroud)

需要7秒

还有什么比我还没试过的更快吗?

Jad*_*ias 13

File.ReadLines 是在.NET 4.0中引入的

var count = File.ReadLines(file).Count();
Run Code Online (Sandbox Code Playgroud)

在4秒内工作,与第一个代码片段同时工作

  • @nCdy:这是一个非常糟糕的建议(在这种情况下)!注意区别:他正在使用`File.ReadLines()`,它实际上返回一个`IEnumerable <string>`并且只执行`yield return`基本上是他的第一个片段.`File.ReadAllLines()`会将__all lines__读入内存,这将是非常糟糕的性能.那说,当然,如果你*已经有一个数组,你应该使用`Length`而不是`Count()`;) (7认同)

Sir*_*ver 12

您的第一种方法看起来确实是最佳解决方案.请记住,您大部分不受CPU限制,但受到HD读取速度的限制,500MB/4秒= 125MB/s已经非常快.获得更快速度的唯一方法是通过RAID或使用SSD,而不是通过更好的算法.