10

我将在代码中性能非常关键的地方使用当前正在运行的线程的 id,所以我应该选择是在某处缓存该 id 还是调用一个方法(gettid对于类 unix 系统和GetCurrentThreadIdWindows)来获取它时间。那么哪个更好呢?获取线程ID是系统调用吗?

4

2 回答 2

14

至少在 Windows 中,GetCurrentThreadId()相当便宜的,而且不涉及系统调用。基本上它可以:

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

将值缓存在您自己的变量中可能会有一点好处,但不是很多。主要好处可能是如果您将变量与其他常用变量一起存储,这可以提高局部性(从而提高缓存使用率)。

因此,除非您正在处理如此紧密的循环,以至于消除内存提取(或可能两个)的可能性很大,否则您不太可能通过缓存它返回的值来获得太多收益。

于 2013-02-21T17:15:13.650 回答
1

不,这不是一个昂贵的电话。这是一个系统调用或类似的,但远非昂贵。显然,如果您可以将值缓存在一个简单的变量中,那么它的速度会提高 10 倍。

但就像所有与性能相关的查询一样,这实际上取决于您的基准测试。你可以很容易地设置使用单个线程,调用函数来获取线程 ID,然后做你想做的事情。测量运行一些测试需要多长时间。然后用相同范围内的常数值替换对线程 ID 的调用,看看效果如何。

于 2013-02-21T16:51:49.543 回答