微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

许多文件之间的许多数据最快的套接字方法

我正在构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中读取字节数?

使用button/事件来显示一个新的窗体并隐藏现有的C#

使用单声道在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来复用很多东西可能会让人头疼,难道你不能使用已经写好的东西吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐