我正在学习C#异步套接字编程,并且我已经了解到在某种池中重用字节缓冲区是个好主意,然后在从套接字接收数据时根据需要检查一个.
但是,我已经看到了两种不同的字节数组池方法:一种是使用简单的队列系统,只是根据需要在队列中添加/删除它们.如果请求了一个并且队列中没有剩余,则会创建一个新的字节数组.
我见过的另一种方法是为整个程序使用一个大字节数组.队列的概念仍然适用,但它是一个整数队列,它确定要使用的字节数组的片(偏移量).如果请求了一个并且队列中没有剩余,则必须调整阵列的大小.
对于高度可扩展的服务器,哪一个是更好的解决方案?我的直觉是,使用多个字节数组会更便宜,因为我想要根据需要调整数组大小(即使我们在大块中分配它)也会非常昂贵,特别是当它变大时.使用多个阵列似乎也更直观 - 使用一个我没想到的大型阵列有一些优势吗?
你的直觉是正确的.每次需要使数组变大时,您将重新创建数组并复制现有的字节.由于我们在这里讨论字节,因此数组的大小可能会很快变大.因此,每次都会要求连续的内存,这取决于程序使用内存的方式,可能会也可能不会存在.这也将成为一个虚拟池,可以这么说.根据定义,池具有一组由多个客户端管理和共享的多个项目.
一个阵列解决方案实现起来也更复杂.好消息是,一个阵列解决方案允许您提供可变大小的块,但这是以实际上重新实现malloc为代价的:处理碎片等等,这是您不应该进入的.
多阵列解决方案允许您使用N个缓冲区初始化池,并以简单的方式轻松管理它们.绝对是我推荐的方法.