2013-02-21 76 views
8

我將在我的代碼中使用當前正在運行的線程的id,因此我應該選擇是否在某處緩存該id或調用方法(對於類Unix系統,請使用gettid,對於windows請使用GetCurrentThreadId)每次都得到它。那哪個更好?線程ID是系統調用嗎?獲得當前線程時間id的操作是否昂貴?

回答

0

不,這不是一個昂貴的電話。這是一個系統調用或類似的,但遠非昂貴的。很明顯,如果你可以緩存一個簡單的變量值,那麼它會使其速度提高10倍。

但是,與所有與性能相關的查詢一樣,它確實取決於你的基準測試。你可以很容易地設置一些東西來使用單個線程,調用函數來獲取線程ID,並做你想做的事情。測量運行一些測試需要多長時間。然後用相同範圍內的一個常數值替換線程ID的調用,並查看結果如何。

7

至少在Windows中,GetCurrentThreadId()便宜,並且不涉及系統調用。基本上它的工作原理如下:

int GetCurrentThreadId() { 
    _asm { 
     mov eax, fs:[18h] 
     mov eax, [eax+24h] 
    } 
} 

在自己的變量中緩存值可能有一點好處,但不是很多。如果您將變量與其他常用變量一起存儲,這可能會提高局部性(並因此緩存使用率),主要好處可能在於。因此,除非你正在研究如此緊密的循環以消除內存獲取(或可能是兩個)的可能性很大,否則通過緩存它返回的值不太可能獲得太多收益。

+1

我見過Unix(es)做同樣的事情(但與gs,並不重要)。所以你的答案對於多個平臺是正確的。這很便宜。 – boiler96 2013-02-21 17:58:42

相關問題