Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows posix套接字性能_Windows_Sockets_Serversocket - Fatal编程技术网

Windows posix套接字性能

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网络编程的信息。主要是如何获得一个可执行文件来处理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执行二进制搜索而不是线性搜索
然后,根据阵列的大小,FD_集可以得到极大的改进(虽然FD_集的性能会有所下降,但我们假设FD_集是一种很少操作)


在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()慢。有可能是自年以来有所改进。