今天早些时候,我做了一个轻量级的内存流,它基本上写入一个字节数组。我以为我会对他们两个进行基准测试,看看是否存在差异 - 并且有:
(向数组写入1个字节) MemoryStream:1.0001ms 我的:3.0004ms
每个人都告诉我,MemoryStream基本上提供了一个字节数组和一堆方法来处理它。
我的问题:默认的C#库的性能是否比我们编写的代码略好一些? (也许它在发布而不是调试中运行?)
答案 0 :(得分:4)
.NET实现可能比你自己好一点,但是,你是如何进行基准测试的?几百万次迭代,还是只有几次?请记住,您需要使用一个大的测试基础,以便您可以消除一些数据(暂时被调用的CPU等),这将导致错误的结果。
答案 1 :(得分:2)
微软的人比你和我聪明得多,并且我很可能已经在Byte[]
上编写了一个更好的优化包装器,比你或我实现的更好。
如果您感到好奇,我建议您反汇编您重新创建的类型,以了解Microsoft如何实现它们。在框架的一些更重要的领域(比如我想象中),你会发现BCL调用非托管代码来实现其目标。
在这种情况下,非托管代码有更好的机会超越托管代码,因为您可以自由地使用数组而不需要托管运行时的开销(对于边界检查等等)。
答案 2 :(得分:2)
许多框架程序集都是NGENed,它可以绕过最初的JIT时间给它们一点点提升。这不太可能是2ms差异的原因,特别是如果你在启动秒表之前已经预热了你的方法,但我提到它是完整的。
另外,是的,框架程序集是以“发布”模式构建的(优化和检查),而不是“调试”。
答案 3 :(得分:2)
您可能使用了Array.Copy()
而不是更快Buffer.BlockCopy()
。最快的方法是使用带有指针的不安全代码。查看Mono项目中的how they do this(搜索 memcpy )。
答案 4 :(得分:0)
我敢打赌,微软的实施比你的实施要好一些。 ;)
您检查了来源吗?