2011-05-11 20 views
1

我正在寻找有关Windows网络编程的信息。主要是如何获得单个可执行文件来处理1000个连接。Windows posix套接字的性能

我们在unix上使用select()FD_ISSET等,这个工作很快。在Windows上,这些API非常差。 FD_SET速度较慢,但​​即使在解决此问题时,Windows也比HPUX慢很多。

我正在寻找一个win32 API调用,我可以使用它来代替不需要太多CPU /时间的select()调用。目前我们在select()中花费了50%的时间(和CPU),其中在unix上花费在send()和recv()上的时间,这正是我所期望的。

感谢 尼尔

回答

2

您可能正在寻找Windows I/O Completion Ports。这是SysInternals家伙的article

+0

谢谢,那看起来正是我所需要的。我现在要决定的主要事情是我应该用I/O完成端口还是使用java来重新实现服务器(因为我们已经有50%的服务器运行java和50%c遗留程序),我喜欢继承30年前的代码和被告知修复Windows性能问题:) – 2011-05-11 14:44:09

+0

其他有用的链接 - http://msdn.microsoft.com/en-us/library/aa365198.aspx - http://int64.org/2009/05/13/high -performance-io-on-windows – 2011-05-11 15:10:13

1

如果你真的进入可伸缩套接字编程,没有什么能胜过Windows上的IO完成端口。

话虽如此,你的程序可能需要对完成端口模型进行大的重写。

但是,即使使用select()/ FD_ISSET也可以提高性能。

这里是它是如何做: 在winsock2.h FD_SET定义为SOCKET的数组和要素计数

typedef struct fd_set { 
    u_int fd_count;    /* how many are SET? */ 
    SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */ 
} fd_set; 

此外,在winsock2.h你会发现,FD_SET增加一个插槽在这个数组的末尾,FD_ISSET正在数组中进行线性搜索。

现在,如果你改变宏使用套接字的有序排列,即

  • FD_SET增加了插座的排序顺序
  • FD_ISSET做二进制搜索,而不是线性

则依赖于FD_ISSET数组的大小可以大大提高(虽然FD_SET的性能会有所下降,但我们假设FD_SET很少运行)。

在Unix上,select()的性能比FD_SET更好,FD_SET/FD_ISSET只是测试或设置一点。在Windows上,此技术不适用,因为套接字不是一个小的正面文件描述符编号,而是一个HANDLE,并且句柄的标量值可能很大。

+0

我已经使用这种类型的'fix'来将性能从360s提升到30s,但是这仍然比HPUX需要1或2秒的时间慢得多。它确实删除了很多代码的n个部分。 – 2011-05-11 15:01:00

+0

是的,这绝对是一个klugde,并且一个好的解决方案可以完成异步端口。WSAPoll()(类似于Unix poll(),自Vista以来可用)可能值得研究 - 尽管我记得它在第一次发布时相当慢 - 在我的测试中比select()慢。自那以后可能会有所改进。 – 2011-05-11 18:05:24