基本的C#hex编辑器性能问题

时间:2014-07-10 00:43:50

标签: c# string performance

我正在研究一个简单的十六进制编辑器的速度问题 即时通讯使用后台工作程序,简单的for / foreach循环和几个简单的语句,但它仍然比现代十六进制编辑器慢一点

这是需要很长时间才能完成的主循环

    for (int i = 0; i < buffer.Count() - 1; i++)
    {
        string hex = Convert.ToString(buffer[i], 16);
        hexstring += ((hex.Length == 1 ? hex = "0" + hex : hex = hex)) + " ";
        double x = ((double)i/(double)buffer.Count());
        bw.ReportProgress((int)(x * 100));
    }

我知道这可写得好一百万倍,但我很好奇导致这种延迟的原因 一个1 MB的exe。需要5分钟+ 50%的CPU使用量,这还远未被接受,有什么想法吗?

编辑1:缓冲区只是一个字节[],这是它的另一个用法

buffer = File.ReadAllBytes(((string[]) e.Data.GetData(DataFormats.FileDrop, false))[0]);

2 个答案:

答案 0 :(得分:4)

我讨厌成为&#34;那家伙&#34;在这种情况下,你可以重新发明一个内置的轮子。 .NET中有一个函数可以将字节数组转换为十六进制字符串。你所需要的只是 love ,错误就是这样:

string hex = BitConverter.ToString(buffer);

我认为这并不能回答你为何解决问题的问题。由于字符串不变性,您的解决方案主要是缓慢的。字符串是不可变的(只读),当您连接它们(AKA将它们与++=运算符组合在一起)时,您将创建一个新对象。你为每个循环创建了3个,有时是4个字符串,这不便宜,因为它们占用了内存而垃圾收集器最终必须收集它们。您可以通过使用StringBuilder来避免这种情况,该buffer在附加字符串时会浮动缓冲区(与创建新字符串相比)。此外,如果{{1}}很大,则需要一段时间 - 这种野兽的性质(更多操作需要更长时间)。希望这有帮助!

答案 1 :(得分:3)

原因是您使用+=运算符来连接字符串。

每次执行此操作时,它会将字符串的所有先前内容和添加的内容复制到新字符串中。每次都会有越来越多的数据要移动。在循环结束时,每次迭代将移动6 MB的数据。

完成为1 MB数据创建字符串后,您将复制3 TB数据。这比可用的RAM多一点,因此还需要完成一大堆垃圾收集来清理旧字符串并为新字符串腾出空间。

如果您改用StringBuilder,您会看到性能发生巨大变化。


接下来需要改进的是报告进度不那么频繁。例如,您可以为每千字节处理而不是每个字节执行此操作。