經過以上的分析能夠看出,poll和select的實現基本是一致,只是用戶到內核傳遞的數據格式有所不一樣,性能
select和poll即便只有一個描述符就緒,也要遍歷整個集合。若是集合中活躍的描述符不多,遍歷過程的開銷就會變得很大,而若是集合中大部分的描述符都是活躍的,遍歷過程的開銷又能夠忽略。測試
epoll的實現中每次只遍歷活躍的描述符(若是是水平觸發,也會遍歷先前活躍的描述符),在活躍描述符較少的狀況下就會頗有優點,在代碼的分析過程當中能夠看到epoll的實現過於複雜而且其實現過程當中須要同步處理(鎖),若是大部分描述符都是活躍的,epoll的效率可能不如select或poll。(參見epoll 和poll的性能測試 http://jacquesmattheij.com/Poll+vs+Epoll+once+again)指針
select可以處理的最大fd沒法超出FDSETSIZE。事件
select會複寫傳入的fd_set 指針,而poll對每一個fd返回一個掩碼,不更改原來的掩碼,從而能夠對同一個集合屢次調用poll,而無需調整。get
select對每一個文件描述符最多使用3個bit,而poll採用的pollfd須要使用64個bit,epoll採用的 epoll_event則須要96個bit同步
若是事件須要循環處理select, poll 每一次的處理都要將所有的數據複製到內核,而epoll的實現中,內核將持久維護加入的描述符,減小了內核和用戶複製數據的開銷。it