C# - 默认库有更好的性能吗?

时间:2009-12-07 05:10:11

标签: c# performance

今天早些时候,我做了一个轻量级的内存流,它基本上写入一个字节数组。我以为我会对他们两个进行基准测试,看看是否存在差异 - 并且有:

(向数组写入1个字节) MemoryStream:1.0001ms 我的:3.0004ms

每个人都告诉我,MemoryStream基本上提供了一个字节数组和一堆方法来处理它。

我的问题:默认的C#库的性能是否比我们编写的代码略好一些? (也许它在发布而不是调试中运行?)

5 个答案:

答案 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)

我敢打赌,微软的实施比你的实施要好一些。 ;)

您检查了来源吗?