为什么c#内置的IO类比自制的类更快?

为什么c#内置的IO类比自制的类更快?,第1张

概述当我决定在C#中自己实现 Java ByteBuffer时,我以为它会比MemoryStream BinaryWriter / BinaryReader快.我通过ILSpy看了他们的源码,并且有很多检查和帮助方法调用,而在我的实现中,我直接使用底层的字节数组.但是,当测试表明重型内置类的方法调用比我的轻型方法的调用速度快几乎两倍时,我感到非常惊讶. 例如: public void WriteByt 当我决定在C#中自己实现 Java ByteBuffer时,我以为它会比MemoryStream BinaryWriter / BinaryReader快.我通过ILSpy看了他们的源码,并且有很多检查和帮助方法调用,而在我的实现中,我直接使用底层的字节数组.但是,当测试表明重型内置类的方法调用比我的轻型方法的调用速度快几乎两倍时,我感到非常惊讶.

例如:

public voID WriteBytes(Byte[] buffer,Int32 offset,Int32 count){    this.EnsureFreeSpace(count);    Buffer.Blockcopy(buffer,offset,this.buffer,this.position,count);    this.position += count;    if (this.length < this.position)    {        this.length = this.position;    }}public voID ReadBytes(Byte[] buffer,Int32 count){    this.EnsureDataExist(count);    Buffer.Blockcopy(this.buffer,buffer,count);    this.position += count;}private voID EnsureFreeSpace(Int32 count){    if (this.buffer.Length - this.position < count)    {        throw new InvalIDOperationException();    }}private voID EnsureDataExist(Int32 count){    if (this.length - this.position < count)    {        throw new InvalIDOperationException();    }}

〜1.5-2倍慢

memoryStream.Write(...)memoryStream.Read(...)

在这个简单的测试中

Byte[] temp = new byte[64];stopWatch.Restart();for (int i = 0; i < 100000; i++){    ms.Write(temp,temp.Length);    ms.position = 0;    ms.Read(temp,temp.Length);    ms.position = 0;}stopWatch.Stop();Console.Writeline(stopWatch.ElapsedMilliseconds);stopWatch.Restart();for (int i = 0; i < 100000; i++){    mb.WriteBytes(temp,temp.Length);    mb.position = 0;    mb.ReadBytes(temp,temp.Length);    mb.position = 0;}stopWatch.Stop();Console.Writeline(stopWatch.ElapsedMilliseconds);

为什么?

在所有的测试优化启用.在调试模式下,平均差异如我所说〜1.7倍.在发布模式〜1.3倍,少但仍然存在.

编辑
感谢我的建议,我发现在Visual Studio之外,我的代码比内置代码快几倍或至少一样快.所以现在的问题是,为什么会发生这种情况?

@H_301_22@解决方法 我的看法是你没有正确地测试其性能.此主题已经覆盖了好几次,我发现Eric lippert的这个博客系列非常有启发性: http://tech.pro/blog/1293/c-performance-benchmark-mistakes-part-one

作为一个捷径,请执行以下 *** 作:将整个测试代码放在for循环中并运行多次,比较输出并总是丢弃第一个结果.

总结

以上是内存溢出为你收集整理的为什么c#内置的IO类比自制的类更快?全部内容,希望文章能够帮你解决为什么c#内置的IO类比自制的类更快?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1261155.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存