為什么我的線程數(shù)越多計(jì)算時(shí)間反而慢了呢
首先我們應(yīng)該知道,操作系統(tǒng)是如何使用線程的。每個(gè)進(jìn)程中可以啟動(dòng)若干個(gè)線程,這些線程跟操作系統(tǒng)請(qǐng)求計(jì)算資源,操作系統(tǒng)也許沒我們想的那么智能,它不一定按照我們想要的方式去講線程與計(jì)算核心對(duì)應(yīng)起來(lái)。
比如,有時(shí)候,我們的線程內(nèi)部的計(jì)算需要在磁盤讀取數(shù)據(jù),這樣就會(huì)使得當(dāng)前線程等待,操作系統(tǒng)就可能智能的把它掛起了,它的計(jì)算資源又被其它線程使用了,等到數(shù)據(jù)準(zhǔn)備完畢之后,操作系統(tǒng)又將掛起的線程以及他的資源(寄存器數(shù)據(jù),緩存數(shù)據(jù))一同放到一個(gè)計(jì)算核心(計(jì)算資源)上(實(shí)際上操作系統(tǒng)可能不會(huì)吧所有緩存數(shù)據(jù)都拉出到內(nèi)存,但是如果在第一個(gè)線程等待時(shí),插入的線程的使用了大量緩存,你的原有緩存數(shù)據(jù)就極有可能被沖掉了,就需要重新緩存),當(dāng)然這個(gè)時(shí)候你被喚醒的線程可能不會(huì)再原有的核心上了,總之這種線程切換的過程會(huì)使得你的線程計(jì)算時(shí)間變慢了。
又比如,你的線程數(shù)量過多。這個(gè)情況下,如果線程的負(fù)載是雷同的,那么你的線程很可能被頻繁切換,這樣也會(huì)把時(shí)間變慢。不過不是說線程數(shù)比核心數(shù)少就好,這個(gè)要有個(gè)度。你的線程負(fù)載均衡的話,如果線程切換時(shí)間能很好的彌補(bǔ)掉線程掛起等待的時(shí)間,各個(gè)線程交錯(cuò)執(zhí)行,完全占用計(jì)算資源,你的計(jì)算速度才會(huì)快。
以上只是一時(shí)興起,暫作之討論,不正確的地方,煩請(qǐng)批評(píng)指正,歡迎跟帖討論。