【问题标题】:Is operation of getting id of current thread time expensive? [duplicate]获取当前线程时间的 id 操作是否昂贵? [复制]
【发布时间】:2013-02-21 16:47:38
【问题描述】:

我将在代码中性能非常关键的地方使用当前正在运行的线程的 id,所以我应该选择是在某处缓存该 id 还是调用方法(gettid 用于类 unix 系统和 @ 987654322@ for windows)每次都得到它。那么哪个更好呢?获取线程 id 是系统调用吗?

【问题讨论】:

    标签: c++ c multithreading


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我见过 Unix(es) 做同样的事情(但对于 gs,这并不重要)。因此,您的答案对于多个平台都是正确的。很便宜。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-06-24
      • 1970-01-01
      • 2010-12-15
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2020-12-17
      相关资源
      最近更新 更多