【问题标题】:C# Arrays vs. StreamsC# 数组与流
【发布时间】:2012-05-15 11:44:52
【问题描述】:

在编写对可能无限“流”数据(即字节、字符等)进行操作的函数时,在决定将字符串/数组与流用于输入/输出时,有哪些设计注意事项?

总是编写函数来使用流,然后制作使用流包装器(即 StringReader/Writer)的重载方法来返回“简单数据”,例如不需要处理的数组或字符串等,是否会对性能产生巨大影响?考虑?

我认为在数组上操作的函数要方便得多,因为您可以“返回”结果数组,而且您通常不必担心处理。我认为流运算符很好,因为它们可以对无限的数据源进行操作,而且可能还可以节省内存。

【问题讨论】:

  • 无论您使用哪种集合或流类(LinkedList 除外),最终都归结为核心的 byte[]。机器支持的基本且唯一的集合类型。这肯定是一个痛苦的阻抗不匹配,总是更好地使用工具箱中的那些并且已经这样做了。

标签: c# arrays performance stream


【解决方案1】:

如果您正在编写一个函数来处理数据流,那么为什么不将其作为IEnumerable<T> 传递。然后,您可以在生成器函数中将流作为IEnumerable<T> 返回。换句话说,使用return yield 每次返回一个结果。

在某些情况下,由于评估是根据需要进行的,因此您最终可能会逐渐提高性能。

【讨论】:

  • 我为在内存中对对象集合(即引用类型)进行操作的函数执行此操作,但我不确定我是否喜欢使用这种方法对原语进行操作的想法。例如,如果流被设计为省略某些模式,那么您将不得不实现更多必要的循环,因为您不能一次产生返回一堆值。
【解决方案2】:

如果您正在处理未知大小的二进制数据,请始终使用流。例如,如果可以避免,将整个文件读入字节数组通常是个坏主意。 .Net 中大多数处理二进制数据的函数(如加密和压缩)都是使用流作为输入/输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-22
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多