Windows posix套接字性能
我正在寻找有关Windows网络编程的信息。主要是如何获得一个可执行文件来处理1000个连接 我们在unix上使用select()FD_ISSET等,这非常快。在Windows上,这些API非常差。FD_设置要慢得多,但即使在解决这个问题时,Windows也比HPUX慢得多 我正在寻找一个win32 API调用,我可以使用它来代替不需要太多CPU/时间的select()调用。目前,我们在select()上花费了50%的时间(和CPU),而在unix上,在send()和recv()上花费的时间是我所期望的 谢谢Windows posix套接字性能,windows,sockets,serversocket,Windows,Sockets,Serversocket,我正在寻找有关Windows网络编程的信息。主要是如何获得一个可执行文件来处理1000个连接 我们在unix上使用select()FD_ISSET等,这非常快。在Windows上,这些API非常差。FD_设置要慢得多,但即使在解决这个问题时,Windows也比HPUX慢得多 我正在寻找一个win32 API调用,我可以使用它来代替不需要太多CPU/时间的select()调用。目前,我们在select()上花费了50%的时间(和CPU),而在unix上,在send()和recv()上花费的时间是我
尼尔你可能正在寻找。这是大家的一个建议。如果你真的喜欢可伸缩套接字编程,没有什么比Windows上的IO完成端口更好的了 话虽如此,您的程序可能需要对完成端口模型进行大量重写 但是,即使使用select()/FD_ISSET,也可以提高性能 以下是如何做到这一点: 在winsock2.h中,fd_集定义为套接字数组和元素计数器
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执行二进制搜索而不是线性搜索
在unix上,select()的性能更好,因为它们FD_设置为位图,FD_SET/FD_ISSET只需测试或设置一位。在Windows上,此技术不适用,因为套接字不是一个小的正文件描述符数,它是一个句柄,句柄的标量值可能很大。谢谢,这看起来正是我需要的。我现在必须决定的主要问题是,我应该使用I/O完成端口或使用java重新实现服务器(因为我们已经有50%的服务器运行java和50%的c遗留程序)我喜欢继承已有30年历史的代码,并被告知修复Windows性能问题:)其他有用的链接--我使用了这种类型的“修复”将性能从360秒提高到30秒,但这仍然比HPUX所需的1或2秒慢得多。它确实删除了代码中相当多的n平方部分。是的,这绝对是个骗局,一个好的解决方案可以实现异步io a la完成端口。WSAPoll()(类似于Unix poll(),从Vista开始提供)可能值得研究——尽管我记得它在第一次发布时相当慢——比我测试中的“优化”select()慢。有可能是自年以来有所改进。