Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net HttpWebResponse响应流的最佳缓冲区大小_.net_Buffer_Httpwebresponse - Fatal编程技术网

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

.net HttpWebResponse响应流的最佳缓冲区大小,.net,buffer,httpwebresponse,.net,Buffer,Httpwebresponse,HttpWebResponse.GetResponseStream()流的最佳缓冲区大小是多少 在线示例从256b到5Kb不等。有什么好处?我想缓冲区大小可能是根据情况而定的。如果是,在什么情况下使用什么类型的缓冲区大小 谢谢。真的,没什么大不了的 当然,如果您使用非常小的缓冲区,您可能需要通过层进行一些额外的调用来获取字节(尽管流可能至少进行了一些缓冲——我不知道它的默认值是什么)。当然,如果使用非常大的缓冲区,会浪费一些内存并引入一些碎片。因为你显然在这里做IO,任何你通过调整缓冲区获得的时

HttpWebResponse.GetResponseStream()流的最佳缓冲区大小是多少

在线示例从256b到5Kb不等。有什么好处?我想缓冲区大小可能是根据情况而定的。如果是,在什么情况下使用什么类型的缓冲区大小


谢谢。

真的,没什么大不了的

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

一般来说,在2048(2k)和8192(8k)之间,我的幂为2。只要确保你知道你在做什么,如果你去一个缓冲区等于或大于85000字节(然后是一个)

事实上,比缓冲区大小更重要的是您持有它的时间。对于大型对象堆之外的对象,GC非常擅长处理寿命非常短的对象(第0代集合非常快)或寿命非常长的对象(第2代)。如果对象的寿命足够长,可以在释放前到达Gen 1或Gen 2,则相对而言成本更高,而且通常比缓冲区有多大更值得您花时间担心


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

我的轶事经验是,它确实取决于你在做什么,但通常在1024-4096字节(1-4KB a.k.a.2的幂)范围内将给我类似的性能(4KB是我见过的“最佳”数字)

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


正如Jonathan所指出的,在尝试过早的优化之前,请测试您当前的实现。

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

当我将它设置为409600大尺寸后,下载速度要快得多,我认为额外的调用会花费开销,或者导致下载速度变慢。可能在网络级别,缓冲区超过了您的缓冲区大小,因此TCP需要再次请求重新发送包吗?(只是一个猜测,因为我不知道TCP是如何工作的),然而较小的缓冲区大小肯定会减慢我的下载速度。我已经通过使用firefox默认下载(没有插件和segmenetation)和使用我的类来测试了它,两者相差太远了


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

非常有用的帖子,但我想你是说8192?2的力量->2048,4096,8192(8k)。上传一个大文件(2Gb)时我也遇到了同样的情况:更大的缓冲区使上传速度更快