(C#)计算文件中字节的最快方法是什么?

(C#)计算文件中字节的最快方法是什么?,c#,C#,我想知道一种计算文件中所有字节的最快方法?我需要处理大的二进制文件 我想知道文件中所有字节的数量(0x00、0x01、…0xff的数量) 它用于在我的WPF Hexeditor用户控件中添加具有文件表示形式的图形,就像在HxD Hexeditor中一样 这段代码工作得很好,但对于大文件来说速度很慢 public Dictionary<int, long> GetByteCount() { if (IsOpen) { Position = 0;

我想知道一种计算文件中所有字节的最快方法?我需要处理大的二进制文件

我想知道文件中所有字节的数量(0x00、0x01、…0xff的数量)

它用于在我的WPF Hexeditor用户控件中添加具有文件表示形式的图形,就像在HxD Hexeditor中一样

这段代码工作得很好,但对于大文件来说速度很慢

public Dictionary<int, long> GetByteCount()
{
    if (IsOpen)
    {
        Position = 0;
        int currentByte = 0;

        // Build dictionary
        Dictionary<int, long> cd = new Dictionary<int, long>();
        for (int i = 0; i <= 255; i++) cd.Add(i, 0);
        //

        for (int i = 0; i <= Length; i++)
        {
            //if (EOF) break;

            currentByte = ReadByte();                    
            if (currentByte != -1) cd[currentByte]++;

            Position++;
        }

        return cd;
    }

    return new Dictionary<int, long>();
}
公共字典GetByteCount()
{
if(等参线)
{
位置=0;
int currentByte=0;
//建立字典
字典cd=新字典();

对于(int i=0;i来说,您似乎想要这样的东西:

public Dictionary<char, long> GetCharCount(string filePath)
{
    var result = new Dictionary<char, long>();
    var content = File.ReadAllText(filePath);

    foreach(var c in content)
    {
        if (result.ContainsKey(c))
        {
            result[c] = result[c] + 1;
        }
        else
        {
            result.Add(c, 1);
        }
    }

    return result;
}
公共字典GetCharCount(字符串文件路径)
{
var result=newdictionary();
var content=File.ReadAllText(文件路径);
foreach(内容中的var c)
{
如果(结果(c))
{
结果[c]=结果[c]+1;
}
其他的
{
结果:添加(c,1);
}
}
返回结果;
}
//
///获取一个长数组,计算文件中每个字节的总数。
///数组的位置可以获得所需字节的和
/// 
public long[]GetByteCount()
{
if(等参线)
{
常量int bufferLenght=1048576;//1mb
var storedCnt=新长[256];
位置=0;
而(!Eof)
{
var testLenght=长度-位置;

var buffer=testLenght我对David的解决方案进行了一点优化。不需要“Position”调用。我发现缓冲区长度和无缓冲读取模式不是很重要,但是计算中的“for”而不是“foreach”构造产生了很大的不同

结果与

foreach (var b in buffer.Take(count))
{
    storedCnt[b]++;
}

file length is 4110217216
duration 00:00:51.1686821
for(var i = 0; i < count; i++)  
{
    storedCnt[buffer[i]]++;
}

file length 4110217216
duration 00:00:05.9695418
结果与

foreach (var b in buffer.Take(count))
{
    storedCnt[b]++;
}

file length is 4110217216
duration 00:00:51.1686821
for(var i = 0; i < count; i++)  
{
    storedCnt[buffer[i]]++;
}

file length 4110217216
duration 00:00:05.9695418
这是我们的课

internal class FileBytesCounter
    : FileStream
{
    private const FileOptions FileFlagNoBuffering = (FileOptions)0x20000000;
    private const int CopyBufferSize = 1024 * 1024;
    //private const int CopyBufferSize = 4 * 1024 * 16;

    public FileBytesCounter(string path, FileShare share = FileShare.Read)
        : base(path, FileMode.Open, FileAccess.Read, share, CopyBufferSize/*, FileFlagNoBuffering*/)
    {
    }

    public long[] GetByteCount()
    {
        var buffer = new byte[CopyBufferSize];
        var storedCnt = new long[256];
        int count;

        Position = 0;

        while ((count = Read(buffer, 0, CopyBufferSize)) > 0)
        {
            for(var i = 0; i < count; i++)  
            {
                storedCnt[buffer[i]]++;
            }
        }

        return storedCnt;
    }
}
内部类FileBytesCounter
:文件流
{
private const FileOptions FileFlagNoBuffering=(FileOptions)0x20000000;
私有常量int CopyBufferSize=1024*1024;
//私有常量int CopyBufferSize=4*1024*16;
公共FileByteCounter(字符串路径,FileShare share=FileShare.Read)
:base(路径、FileMode.Open、FileAccess.Read、share、CopyBufferSize/*、FileFlagNoBuffering*/)
{
}
public long[]GetByteCount()
{
var buffer=新字节[CopyBufferSize];
var storedCnt=新长[256];
整数计数;
位置=0;
而((计数=读取(缓冲区,0,CopyBufferSize))>0)
{
对于(变量i=0;i

另请参见FileFlagNoBuffering

,该代码不计算所有字节的总和。它计算字符数。对不起,我的英语是我想要的“计算所有字符”对于大型文件,您的性能目标是什么?这是瓶颈吗?@CodingYoshi现在我可以在3.5gb文件上达到10秒。@Ken我的观点是这里或任何其他修订中都没有字符Hank:)它只适用于文本文件。我需要在缓冲区中读取大型二进制文件,这可能是最大的速度提升,但使用256个长度的简单数组也可能会获得一些额外的速度,因为您知道只能有256个值。您不需要字典的额外灵活性和复杂性,字典允许您存储变量值的数量。Read应返回读取的字节数,即bufferlength或剩余字节。将其添加到位置更安全,则无需调整EOF。这将导致计算错误,因为您不允许在最后调用
Read
时读取部分缓冲区。A与您的解决方案Georg类似,简单且非常快速。我有在我的项目中测试并植入:感谢帮助如果你想查看我的github项目:)你可以喜欢它。