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

Mih*_*yan 9 c c++ multithreading

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

Jer*_*fin 10

至少在Windows中,GetCurrentThreadId()非常便宜,并且不涉及系统调用.基本上它适用于:

int GetCurrentThreadId() { 
    _asm { 
        mov eax, fs:[18h]
        mov eax, [eax+24h]
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


Mat*_*son 1

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

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