多線程提高效率的情況

今天遇到一個問題,一個高頻聲卡操作流程中加入一行printf(printf不是內核調用而是屬於標準函數庫)嚴重影響了系統的效率以致程序未能達到目的,不加printf則運行正常,那些同時操作複雜界面和播放音效的遊戲都能順暢地運行,說明真正原因並不在於增加了多少CPU的負擔,而可能是兩個阻塞流程串行運行對其中一個高頻操作的運行造成了影響。於是嘗試分了兩個線程分開處理,結果效率提高了兩倍(以運行總時間判斷)以上。
上網查詢多線程提高效率的問題得到一個說法:
“如果你的程序僅僅是做一種簡單的計算,其間不涉及任何可能是使線程掛起的操作,如I/O讀寫,等待某種事件等等。那麼從表面上看,兩個線程與單個線程相比,增加了切換的開銷,應該比慢纔對。但問題是你還得考慮操作系統的調度策略,通常,在支持線程的操作系統中,線程纔是系統調度的單位,對同樣一個進程來講,多一個線程就可以多分到CPU時間,特別使從一個增加到兩個的時候舉例來說,假如在你的程序啓動前,系統中已經有50個線程在運行,那麼當你的程序啓動後,假如他只有一個線程,那麼平均來講,它將獲得1/51的CPU時間,而如果他有兩個線程,那麼就會獲得2/52的CPU時間。當然,這個例子是一種非常理想的情況,他沒有考慮系統中原有其他線程的繁忙(或者空閒)程度,也沒有考慮線程切換”
不過能夠提高一倍以上效率,肯定不僅僅是分配更多CPU時間那麼簡單,可能是這種多流程串行的高頻操作會給CPU的調度造成麻煩,而分線程分類處理後CPU可以優化調度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章