[英]Windows posix sockets performance
我正在尋找有關Windows網絡編程的信息。 主要是如何獲得單個可執行文件以應對1000個連接。
我們在unix上使用select()FD_ISSET等,這非常快速。 在Windows上,這些API非常差。 FD_SET慢很多,但是即使解決此問題,Windows也比HPUX慢很多。
我正在尋找一個win32 API調用,而不是需要太多CPU /時間的select()調用,我可以使用它。 目前,我們在select()中花費了50%的時間(和CPU),而在unix上,在send()和recv()中花費的時間,這正是我所期望的。
謝謝尼爾
您可能正在尋找Windows I / O完成端口 。 這是SysInternals伙計們的文章 。
如果您真的喜歡可伸縮套接字編程,那么沒有什么比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在該數組的末尾添加了一個SOCKET,而FD_ISSET在該數組中進行線性搜索。
現在,如果您更改宏以使用SOCKET的排序數組,即
然后可以大大改善依賴於數組FD_ISSET的大小(雖然FD_SET的性能會有所降低,但是我們假設FD_SET很少執行)。
在Unix上,select()的性能更好,因為它們將FD_SET作為位圖,而FD_SET / FD_ISSET僅測試或設置了一點。 在Windows上,此技術將不適用,因為套接字不是一個小的正文件描述符號,它是一個HANDLE,並且句柄的標量值可能很大。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.