【问题标题】:c# Converting a i.o. stream to a byte[] is slowc# 转换 i.o.流到 byte[] 很慢
【发布时间】:2019-02-23 04:34:32
【问题描述】:

毫无疑问,我的代码运行良好。问题是它太慢了!

如果我使用 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();
}

【问题讨论】:

  • 你任由其他应用程序和StandardInput... 绝对不是CopyToToArray 会导致问题
  • 所以你认为 Console.OpenStandardInput();是瓶颈吗?

标签: c# stream


【解决方案1】:

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

此外,如果数据很大,您将使用 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);

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

【讨论】:

  • 我能找到的唯一方法是将 Stream(Console.OpenStandardInput) 复制到 MemoryStream,然后将其复制到数组中。 inputstream.Read() 似乎想要读取现有字节。您能否使用我的代码提供更多说明?
  • inputStream.Read(),是的,它在给定位置将指定数量的字节读取到现有缓冲区中。您需要做的就是首先分配正确大小的缓冲区。这是一个示例,我们将缓冲区分配给流的长度,然后全部读取。我已经编辑了上面的帖子以包含代码。
  • 非常感谢。 '会给它一个裂缝,看看它是否更快。
  • 如此接近:我收到错误:流异常 - 此流不支持搜索操作
猜你喜欢
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
相关资源
最近更新 更多