我正在构build一个套接字应用程序,需要将许多中小型文件(如5-100kb大小的文件)转换为许多不同的客户端(有点像Web服务器,但仍不完全)。
我应该只使用标准的poll / epoll(linux)或winsock(win32)中的asynchronous套接字,还是有更多性能的方法(例如在win32上重叠I / O)?
Linux和Windows都是可能的平台!
检查Windows窗体滚动条是否一直向下滚动?
从system :: String转换为std :: string
无法加载可执行文件
如何在不创build窗口的情况下将WPF UserControl呈现给位图
dynamic识别控件的容器(GroupBox等)
如何从WinRT / Metro应用程序中的StreamSocket.InputStream.ReadAsync中读取字节数?
使用单声道在linux中使用newtonsoft json的细分故障
如何以编程方式编辑特定用户的registry项?
如何使初始forms最初不可见或隐藏
在Windows上,您可以尝试使用TransmitFile ,这可以通过避免内核空间用户空间数据复制来提高性能。
在Linux上,使用epoll解复用多个套接字是通过TCP执行并行I / O的最快方法。
但是我还会提到,为了便于携带,(因为您似乎对Linux或Windows感兴趣),您应该查看Boost.Asio。 它有一个可移植的API,但在Linux上使用epoll ,并在Windows上重叠I / O,因此您可以构建高效且便携的网络应用程序。
另外,由于您正在处理文件,因此在执行I / O以达到最佳性能时,还应实施双缓冲。 换句话说,您使用两个缓冲区发送/ recv每个文件。 例如,在发送端,您从磁盘读入一个缓冲区,然后通过网络发送该缓冲区,而另一个线程从磁盘读取下一个数据块到第二个缓冲区。 这样您就可以将磁盘I / O与网络I / O重叠。
在Linux上, sendfile()是专门用于将数据从文件发送到套接字的高性能API(您仍然需要使用poll来进行多路复用,它只是read / write部分的替代)。
除了epoll它看起来像Linux发送文件sendfile(2)将非常适合您在服务器端的需求。
不幸的是,如果你想获得最大的性能,你仍然需要在Windows和Linux上手工编写你的I / O代码,因为当前可用的抽象库不能很好地扩展到多线程(如果有的话)。
如果你想要可移植性(和易用性),提升asio可能是最好的选择,但是当涉及到多线程可伸缩性时,它确实有其局限性(请参阅C ++套接字服务器 – 无法饱和cpu ) – 我认为主要问题是集成超时处理,而不会过度锁定到多线程事件循环中。
从本质上讲,为了获得最佳性能,您希望使用的是带有Windows上工作线程池的I / O完成端口,以及Linux上带有工作线程池的边缘触发epoll。
不要过早地优化你的程序。
假设这不是一个过早的优化,最简单的事情就是把所有的数据保存在内存中。 如果你喜欢,你可以将它们mmap(),或者在启动时加载它们。 发送已经在内存中的东西是不容易的。
话虽如此,试图用(例如)epoll来复用很多东西可能会让人头疼,难道你不能使用已经写好的东西吗?