簡體   English   中英

Windows posix套接字性能

[英]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_SET按排序順序添加套接字
  • FD_ISSET進行二進制搜索而不是線性搜索

然后可以大大改善依賴於數組FD_ISSET的大小(雖然FD_SET的性能會有所降低,但是我們假設FD_SET很少執行)。

在Unix上,select()的性能更好,因為它們將FD_SET作為位圖,而FD_SET / FD_ISSET僅測試或設置了一點。 在Windows上,此技術將不適用,因為套接字不是一個小的正文件描述符號,它是一個HANDLE,並且句柄的標量值可能很大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM