我将在我的代码中使用当前正在运行的线程的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. 是destroyDrawingCache()查看昂贵的操作吗?
- 2. OpenGL操作有多昂贵?
- 3. OWLOntologyManager.addAxioms()操作有多昂贵?
- 4. 是读取操作昂贵吗?
- 5. 线程有多昂贵?
- 6. 创建com.rits.cloning.Cloner是否昂贵?
- 7. 数据库操作,是否非常昂贵?
- 8. Executors.newFixedThreadPool() - 这个操作有多昂贵
- 9. 是“ConnectionMultiplexer.IsConnected”昂贵吗?
- 10. PHP中的file_exist()是一个非常昂贵的操作吗?
- 11. 是SQLite cursor.getCount在Android中的昂贵操作
- 12. 是++操作符比|更昂贵Erlang的运算符?
- 13. 是否实例化XmlDocument昂贵?
- 14. 当Java线程执行潜在的阻塞操作时,是否总会丢失当前的CPU时间片?
- 15. 昂贵的StaticResource
- 16. .NET WebService IPC - 是否应该尽量减少一些昂贵的操作?
- 17. 如何昂贵或昂贵是用C++继承
- 18. 阅读/写作偏好昂贵的操作?
- 19. 当你想发送一个匿名函数时,(Runnable&Serializable)是否太昂贵?
- 20. 在UI线程上运行昂贵的操作时保持UI的视觉更新
- 21. 正在读取/写入管道的昂贵操作?
- 22. Java TreeNode:如何防止getChildCount执行昂贵的操作?
- 23. 正在调用部分昂贵的操作?
- 24. Thread.getStackTrace()有多昂贵?
- 25. CreateThread()有多昂贵?
- 26. SurfaceHolder.lockCanvas()过于昂贵
- 27. Cookie是否写得很贵?
- 28. MySQL是像SELECT一样昂贵的吗?
- 29. context.getSystemService()是一个昂贵的调用吗?
- 30. 无法获得当前时间
我见过Unix(es)做同样的事情(但与gs,并不重要)。所以你的答案对于多个平台是正确的。这很便宜。 – boiler96 2013-02-21 17:58:42