获取当前线程id的操作时间昂贵

Is operation of getting id of current thread time expensive?

本文关键字:操作 时间 id 前线 线程 获取      更新时间:2023-10-16

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

至少在Windows中,GetCurrentThreadId()非常便宜,而且不涉及系统调用。基本上它的结果是:

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

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

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

不,这不是一个昂贵的调用。这是一个系统调用或类似的调用,但远不是一个昂贵的调用。显然,如果您可以将值缓存在一个简单的变量中,那么这将使其速度加快10倍。

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