首页 > 解决方案 > c# 将 io 流转换为 byte[] 很慢

问题描述

毫无疑问,我的代码效果很好。问题是它太慢了!

如果我使用streamHelper 以字节为单位读取它或使用stream.Copyto,则大约需要相同的时间。很长时间!

必须有更快的方法吗?

如果我使用 FileStream 从文件路径读取相同的文件,它会在不到 1 秒的时间内处理。

从 Stream 转换为 Byte 大约需要 6 秒。非常感谢所有帮助。谢谢

byte[] byteArray = null;

// Read Data from Port Monitor
Stream inputStream = Console.OpenStandardInput();

using (MemoryStream ms = new MemoryStream())
{
    inputStream.CopyTo(ms);
    byteArray = ms.ToArray();
}

标签: c#stream

解决方案


您肯定可能会因标准输入而延迟。另外,如果您要完全重新读取数据,则可以增量读取而不是一次重新读取所有数据。

此外,如果数据很大,您将使用 CopyTo()(将流复制到流)和 ToArray()(将流复制到数组)复制两次。相反,您应该使用 inputStream.Read() 将数据从原始流直接读入缓冲区。

代码:

// Allocate a buffer the size of the whole stream
byte[] buffer = new byte[inputStream.Length];
// Set position at the beginning of our stream.
inputStream.Position = 0;
// Read all data into our buffer.
inputStream.Read(buffer, 0, buffer.Length);

请记住,某些流没有有效的“长度”属性,但这种情况很少见,我认为您的情况并非如此。请记住,这更快(即使只是一点点),但您的瓶颈可能主要来自标准输入,因此只有在这种情况下才会有很大帮助。


推荐阅读