我学习C#的异步socket编程,我明白了,这是一个好主意,重新使用字节的缓冲区以某种池,然后只检查一个出从套接字接收数据时需要。

然而,我看到做一个字节数组池的两种不同的方法:一种使用简单的排队系统,和刚添加/根据需要从队列中删除它们。如果一个请求和在队列中没有更多的左边,一个新的字节数组被创建。

,我已经看到另一种方法采用用于整个节目的一个大的字节数组。队列的理念仍然适用,而是它的它决定了字节数组使用的切片(偏移)整数的队列。如果一个请求和在队列中没有更多的左侧时,阵列必须被调整大小。

其中哪一个是高度可扩展的服务器更好的解决方案?我的直觉是不是会更便宜,只是用多字节数组,因为需要我想像数组大小改变(即使我们在大块分配的话)将是非常昂贵的,特别是当它变大了。使用多个阵列看起来更直观太 - ?是有一些优势,利用我没有想到的一个庞大的阵列

有帮助吗?

解决方案

您在你的直觉是正确的。每当你需要使阵列更大的时间,你会被重新创建阵列并通过复制现有的字节。因为我们在这里谈论字节数组的大小可能会大得很快。所以,你会被要求每次连续的一块内存,这取决于你的程序是如何使用内存,可能会或可能不会是可行的。这也将生效,成为一个虚拟池,可以这么说。根据定义,池中有一组进行管理,并通过各种客户端共享多个项目。

在一个阵列解决方案也是方式更复杂的实现。好事是,一个阵列的解决方案允许你给可变大小的块,但是这是以基本上重新实现malloc的成本:处理不成,等等等等,你不应该进入

一个多阵列解决方案允许您初始化与缓冲器的氮量池和容易地以简单的方式对其进行管理。绝对的方法我建议。

其他提示

我不建议调整大小的选项。从简单的开始和您的方式工作。它得到一个新的字节缓冲区队列加入到时它耗尽将是一个很好的开头,结尾。你可能要注意线程问题,所以我的建议是使用别人的线程安全的队列实现。

接下来,您可以在更复杂的“指针”成一个大的字节数组块看看,除了我的建议是有4K / 16K(两个多重页面大小的一些权力)块的队列,你索引,当它充满你添加一个大块的队列。其实,我不建议这在所有因复杂性和性能可疑的增益。

从简单的开始,您的方式工作。的缓冲池,使其线程安全的,看你需要什么了。

一票的多个缓冲区,但增加是因为你做异步事情,你需要确保你的队列是线程安全的。默认Queue<T>集合,绝对是的的线程。

SO用户和MS雇员 JaredPar 这里具有良好的线程队列实现:结果 的http:// blogs.msdn.com/jaredpar/archive/2009/02/16/a-more-usable-thread-safe-collection.aspx

如果你使用你需要的在需要的时候应该如何快速成长策略单一的缓冲区。如果以小增量增长它,你可能要经常这样做,往往复制所有数据。如果通过大量的增量增长它(如在未来尺寸是1.5倍,前一个),你可能要面对,当你得到“内存不足”的情况无非是想增加缓冲区。它是一个可扩展的系统两败俱伤的选择。这就是为什么重用小缓冲区是preferrable。

通过一个垃圾收集堆,你应该总是青睐有一个短暂的生命时间小,大小合适的缓冲区。在.NET堆分配器是非常快,代#0集合是很便宜的。

当你把一个静态缓冲区周围,你会占用系统资源的程序的生命。最糟糕的情况是,当它得到足够大的大对象堆在那里将是不能移动的永久性障碍得到感动。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top