当我决定ByteBuffer
用 C# 自己实现 Java 时,我认为它会比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 offset, Int32 count)
{
this.EnsureDataExist(count);
Buffer.BlockCopy(this.buffer, this.position, buffer, offset, 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, 0, temp.Length);
ms.Position = 0;
ms.Read(temp, 0, temp.Length);
ms.Position = 0;
}
stopWatch.Stop();
Console.WriteLine(stopWatch.ElapsedMilliseconds);
stopWatch.Restart();
for (int i = 0; i < 100000; i++)
{
mb.WriteBytes(temp, 0, temp.Length);
mb.Position = 0;
mb.ReadBytes(temp, 0, temp.Length);
mb.Position = 0;
}
stopWatch.Stop();
Console.WriteLine(stopWatch.ElapsedMilliseconds);
为什么?
在所有测试优化中启用。在调试模式下,平均差异是我所说的 ~1.7 倍。在发布模式下 ~1.3 倍,更少但仍然存在。
编辑 感谢我发现在 Visual Studio 之外我的代码比内置代码快几倍或至少一样快的建议。所以现在的问题是,为什么会发生这种情况?