获取当前线程时间的ID的操作是否昂贵?

时间:2013-02-21 16:47:38

标签: c++ c multithreading

我将在我的代码中使用当前正在运行的线程的id在一个性能非常关键的位置,因此我应该选择是在某处缓存该id还是为类似unix的系统调用方法(gettid每次都能得到它。{和GetCurrentThreadId for windows)哪个更好?获取线程ID是系统调用吗?

2 个答案:

答案 0 :(得分:9)

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

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

在自己的变量中缓存值可能会有一点好处,但不是很多。主要好处可能是您将变量与其他常用变量一起存储,这可以改善局部性(因此可以改善缓存使用情况)。

所以,除非你正在进行如此紧密的循环,否则消除内存提取(或可能是两次)的可能性很大,你不可能通过缓存它返回的值来获得更多收益。

答案 1 :(得分:1)

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

但是与所有与性能相关的查询一样,它实际上取决于您的基准测试。您可以非常轻松地设置使用单个线程,调用函数来获取线程ID,并执行您想要执行的操作。测量用它运行一些测试所需的时间。然后用相同范围内的常量值替换线程ID的调用,看看它是如何工作的。