HttpWebResponse响应流的最佳缓冲区大小

时间:2009-04-23 04:28:51

标签: .net buffer httpwebresponse

与HttpWebResponse.GetResponseStream()的流一起使用的最佳缓冲区大小是什么?

在线示例从256b到5Kb不等。是什么赋予了?我想缓冲区大小可能是情境化的。如果是这样,使用什么类型的缓冲区大小的情况是什么?

感谢。

3 个答案:

答案 0 :(得分:7)

真的,这并不重要。

当然,如果你使用非常小的缓冲区,你可能不得不通过各层进行一些额外的调用来获取字节(虽然流可能至少做了一些缓冲 - 我不知道它是什么默认值是)。当然,如果你使用非常大的缓冲区,你会浪费一些内存并引入一些碎片。由于你显然在这里做IO,所以你通过调整缓冲区获得的任何时候都会受到IO时间的支配。

作为一般规则,我在2048(2k)和8192(8k)之间使用2的幂。如果你使用等于或大于85,000字节的缓冲区(然后是"large object" and subject to different GC rules),请确保你知道自己在做什么。

事实上,比缓冲区大小更重要的是你持有多长时间。对于大对象堆之外的对象,GC非常擅长处理非常短暂的对象(Gen 0集合很快)或非常长寿的对象(Gen 2)。在被释放之前长到足以进入第1代或第2代的物体相对来说成本相对较高,而且通常比缓冲区的大小值得花时间担心。

最后一点:如果您认为由于您使用的缓冲区大小而导致性能问题,测试。这不太可能,但谁知道,也许你有一个奇怪的操作系统版本,网络硬件和驱动程序版本的汇合,这对某些大小的缓冲区有一些奇怪的问题。

答案 1 :(得分:3)

我的轶事经验是,它确实取决于你正在做什么,但通常在1024-4096字节范围内的任何东西(1-4KB又称为2的幂)会给我相当的性能(4KB是“最好的“我见过的数字。”

基本上,你需要一个足够大的缓冲区,这样你就不会不必要地从流中读取数据,但不是那么大,你会减少回报。如果您的缓冲区太大(~MBs),那么您将增加内存缓存未命中,这可能实际上开始降低您的性能。当然,这根据实际H / W(总线速度,高速缓存大小等)而变化很大,但我似乎有4MB缓冲区比4KB缓冲区慢的情况(两种情况都有很长的生命周期,所以GC不是一个问题)。

正如Jonathan所说,在尝试过早优化之前测试你当前的实现。

答案 2 :(得分:2)

实际上,当缓冲区大小太小时,我遇到了问题。我测试了它,并验证缓冲区大小不应该设置为小值。在我的示例中,我将其设置为2048,与firefox相比,下载变得非常慢(firefox也没有下载分段,与我的相同)。

在我将它设置为409600的大尺寸后,下载速度会快得多,我认为额外的调用会花费成本,或者使下载速度变慢。也许在网络级别,缓冲区超出了缓冲区大小,因此TCP需要再次重新发送包? (只是猜测,因为我不知道TCP是如何工作的),但是小的缓冲区大小肯定会减慢我的下载速度。我已经通过运行使用firefox默认下载(没有添加和segmenetation)和使用我的类来测试它,两者都太不同了。

现在速度要快得多,每次循环时,它会读取大约200000字节(200Kb),因为此处的连接速度很快,但是在我运行两个线程后,它会慢很多,可能需要与另一个共享线程。