代码之家  ›  专栏  ›  技术社区  ›  SLaks

联锁增量的性能

  •  21
  • SLaks  · 技术社区  · 15 年前

    Interlocked.Increment(ref x) 快于或慢于 x++

    6 回复  |  直到 15 年前
        1
  •  41
  •   Michael    15 年前

    它的速度较慢,因为它强制动作以原子方式发生,并充当内存屏障,消除了处理器围绕指令重新排序内存访问的能力。

    当您希望操作处于原子状态,并且可以在线程之间共享时,应该使用Interlocked.Increment-它不打算完全替代x++。

        2
  •  16
  •   user159489 user159489    15 年前

    根据我们的经验,InterlocatedIncrement()等对Windows的影响相当大。在一个示例案例中,我们能够消除互锁并使用++/--来代替。仅此一项就将运行时间从140秒减少到110秒。我的分析是,互锁强制内存往返(否则其他内核怎么会看到它?)。一级缓存读/写大约是10个时钟周期,但内存读/写更像是100个时钟周期。

        3
  •  7
  •   Rob Kennedy    15 年前

    想一想,你会发现 Increment 定期的加薪

    但是,正如您自己测试它所看到的,它们的性能并不相同。

    这两种选择有不同的目的。通常使用增量运算符。使用

        4
  •  5
  •   Drew Hoskins    15 年前

    比较慢。然而,这是我所知道的在标量变量上实现线程安全的最有效的通用方法。

        5
  •  3
  •   Paul Alexander    15 年前

        6
  •  2
  •   MastsrOfDesaster    13 年前

    我的性能测试:

    电话:65174400

    联锁:113248900

    TimeSpan span = TimeSpan.FromSeconds(5);
    
    object syncRoot = new object();
    long test = long.MinValue;
    
    Do(span, "volatile", () => {
    
        long r = Thread.VolatileRead(ref test);
    
        r++;
    
        Thread.VolatileWrite(ref test, r);
    });
    
    Do(span, "lock", () =>
    {
        lock (syncRoot)
        {
            test++;
        }
    });
    
    Do(span, "interlocked", () =>
    {
        Interlocked.Increment(ref test);
    });