libevent 發生超時后,
while循環一次從堆頂del timer——直到最新調整的最小堆頂不是超時事件為止,(實際是del event),但是會稍后把這個timeout的 event放到active 任務list里,
等待處理,event標記為timeout,等處理actvie隊列時再由應用層callback函數決定怎么處理標記為timeout的事件。
nginx處理超時時,直接刪除紅黑樹中( event結構體里的 )rb node成員,同時調用應用層早已通過add timer注冊好的超時handler函數。之所以沒有用堆,
因為每次直接從內部刪除節點,而不是堆頂部。
關鍵點,采用堆,刪除時間是O(1),但是要調整堆,logn。插入時間基本是lgn。
采用紅黑樹,刪除節點是3次旋轉,但是,找到最小節點要logn。插入時間基本是lgn。
總體看,都差不多。
堆排序和紅黑樹性能比較 :http://blog.sina.com.cn/s/blog_56e6a0750101b0fo.html