我將在我的代碼中使用當前正在運行的線程的id,因此我應該選擇是否在某處緩存該id或調用方法(對於類Unix系統,請使用gettid
,對於windows請使用GetCurrentThreadId
)每次都得到它。那哪個更好?線程ID是系統調用嗎?獲得當前線程時間id的操作是否昂貴?
8
A
回答
0
不,這不是一個昂貴的電話。這是一個系統調用或類似的,但遠非昂貴的。很明顯,如果你可以緩存一個簡單的變量值,那麼它會使其速度提高10倍。
但是,與所有與性能相關的查詢一樣,它確實取決於你的基準測試。你可以很容易地設置一些東西來使用單個線程,調用函數來獲取線程ID,並做你想做的事情。測量運行一些測試需要多長時間。然後用相同範圍內的一個常數值替換線程ID的調用,並查看結果如何。
7
至少在Windows中,GetCurrentThreadId()
是挺便宜,並且不涉及系統調用。基本上它的工作原理如下:
int GetCurrentThreadId() {
_asm {
mov eax, fs:[18h]
mov eax, [eax+24h]
}
}
在自己的變量中緩存值可能有一點好處,但不是很多。如果您將變量與其他常用變量一起存儲,這可能會提高局部性(並因此緩存使用率),主要好處可能在於。因此,除非你正在研究如此緊密的循環以消除內存獲取(或可能是兩個)的可能性很大,否則通過緩存它返回的值不太可能獲得太多收益。
相關問題
- 1. 線程ID在性能方面是否很昂貴?
- 2. pthread_self()是否昂貴?
- 3. 是destroyDrawingCache()查看昂貴的操作嗎?
- 4. OWLOntologyManager.addAxioms()操作有多昂貴?
- 5. OpenGL操作有多昂貴?
- 6. 是讀取操作昂貴嗎?
- 7. 線程有多昂貴?
- 8. NSUserDefaults的讀取訪問是否爲「昂貴」的操作?
- 9. 拆箱是否昂貴?
- 10. 創建com.rits.cloning.Cloner是否昂貴?
- 11. 數據庫操作,是否非常昂貴?
- 12. 收集昂貴操作的Java同步
- 13. Executors.newFixedThreadPool() - 這個操作有多昂貴
- 14. 強制JLabel在昂貴的操作前顯示文本
- 15. 在C#中的RedirectToAction是否昂貴?
- 16. 是「ConnectionMultiplexer.IsConnected」昂貴嗎?
- 17. Java(Solr)線程轉儲有多昂貴?
- 18. PHP中的file_exist()是一個非常昂貴的操作嗎?
- 19. 是否實例化XmlDocument昂貴?
- 20. 是否承諾空交易昂貴?
- 21. 爲什麼浮點操作被認爲是昂貴的?
- 22. 是++操作符比|更昂貴Erlang的運算符?
- 23. 從查詢集到列表,是昂貴的操作?
- 24. 是SQLite cursor.getCount在Android中的昂貴操作
- 25. RabbitMQ創建連接是一個昂貴的操作
- 26. 昂貴的StaticResource
- 27. 當Java線程執行潛在的阻塞操作時,是否總會丟失當前的CPU時間片?
- 28. .NET WebService IPC - 是否應該儘量減少一些昂貴的操作?
- 29. 爲什麼Tomcat的線程比後臺線程更昂貴?
- 30. 如何昂貴或昂貴是用C++繼承
我見過Unix(es)做同樣的事情(但與gs,並不重要)。所以你的答案對於多個平臺是正確的。這很便宜。 – boiler96 2013-02-21 17:58:42