【发布时间】:2013-02-21 16:47:38
【问题描述】:
我将在代码中性能非常关键的地方使用当前正在运行的线程的 id,所以我应该选择是在某处缓存该 id 还是调用方法(gettid 用于类 unix 系统和 @ 987654322@ for windows)每次都得到它。那么哪个更好呢?获取线程 id 是系统调用吗?
【问题讨论】:
标签: c++ c multithreading
我将在代码中性能非常关键的地方使用当前正在运行的线程的 id,所以我应该选择是在某处缓存该 id 还是调用方法(gettid 用于类 unix 系统和 @ 987654322@ for windows)每次都得到它。那么哪个更好呢?获取线程 id 是系统调用吗?
【问题讨论】:
标签: c++ c multithreading
至少在 Windows 中,GetCurrentThreadId()相当便宜,并且不涉及系统调用。基本上它可以:
int GetCurrentThreadId() {
_asm {
mov eax, fs:[18h]
mov eax, [eax+24h]
}
}
将值缓存在您自己的变量中可能会有一点好处,但不是很多。主要好处可能是,如果您将变量与其他常用变量一起存储,这可以提高局部性(从而提高缓存使用率)。
因此,除非您正在处理如此紧密的循环,以至于消除内存提取(或可能两个)的可能性很大,否则您不太可能通过缓存它返回的值来获得太多收益。
【讨论】:
不,这不是一个昂贵的电话。这是一个系统调用或类似的,但远非昂贵的。显然,如果您可以将值缓存在一个简单的变量中,那么它的速度会提高 10 倍。
但与所有与性能相关的查询一样,这实际上取决于您的基准测试。你可以很容易地设置使用单个线程,调用函数来获取线程 ID,然后做你想做的事情。测量运行一些测试需要多长时间。然后用相同范围内的常量值替换对线程 ID 的调用,看看效果如何。
【讨论】: