gpt4 book ai didi

c# - Stream.Copy 是否通过管道传输?

转载 作者:可可西里 更新时间:2023-11-01 02:31:20 26 4
gpt4 key购买 nike

假设我正在编写一个 tcp 代理代码。我正在从传入流中读取并写入输出流。我知道 Stream.Copy 使用缓冲区,但我的问题是:Stream.Copy 方法是在从输入流中获取下一个 block 时写入输出流,还是像“从输入读取 block ,将 block 写入输出,从输入读取 block 等”这样的循环?

最佳答案

下面是 .NET 4.5 中 CopyTo 的实现:

private void InternalCopyTo(Stream destination, int bufferSize)
{
int num;
byte[] buffer = new byte[bufferSize];
while ((num = this.Read(buffer, 0, buffer.Length)) != 0)
{
destination.Write(buffer, 0, num);
}
}

如您所见,它从源读取,然后写入目标。这可能会得到改进 ;)


编辑:这是管道版本的可能实现:

public static void CopyToPiped(this Stream source, Stream destination, int bufferSize = 0x14000)
{
byte[] readBuffer = new byte[bufferSize];
byte[] writeBuffer = new byte[bufferSize];

int bytesRead = source.Read(readBuffer, 0, bufferSize);
while (bytesRead > 0)
{
Swap(ref readBuffer, ref writeBuffer);
var iar = destination.BeginWrite(writeBuffer, 0, bytesRead, null, null);
bytesRead = source.Read(readBuffer, 0, bufferSize);
destination.EndWrite(iar);
}
}

static void Swap<T>(ref T x, ref T y)
{
T tmp = x;
x = y;
y = tmp;
}

基本上,它同步读取一个 block ,开始异步复制到目的地,然后读取下一个 block 并等待写入完成。

我进行了一些性能测试:

  • 使用 MemoryStream,我没想到会有显着的改进,因为它不使用 IO 完成端口(AFAIK);事实上,性能几乎相同
  • 使用不同驱动器上的文件,我希望管道版本的性能更好,但事实并非如此……它实际上稍微慢了一点(5% 到 10%)

所以它显然没有带来任何好处,这可能是它没有以这种方式实现的原因......

关于c# - Stream.Copy 是否通过管道传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12438746/

26 4 0