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

联锁性能。增量

  •  22
  • SLaks  · 技术社区  · 16 年前

    Interlocked.Increment(ref x) x++

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

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

        2
  •  16
  •   user159489 user159489    16 年前

    在这个示例案例中,我估计增量/减量操作的数量约为10亿。因此,在2Ghz CPU上,++/--大约需要5秒,联锁大约需要50秒。将差异分散到几个线程上,接近30秒。

        3
  •  7
  •   Rob Kennedy    16 年前

    想一想,你会意识到 Increment 调用不能比简单应用增量运算符更快。如果是这样,那么编译器对增量运算符的实现将调用 增量 在内部,他们也会表现得一样。

    这两个选项有不同的目的。一般使用增量运算符。使用 增量 当你需要操作是原子性的,并且你确信该变量的所有其他用户也在使用互锁操作时。(如果他们不都合作,那么这真的没有帮助。)

        4
  •  5
  •   Drew Hoskins    16 年前

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

        5
  •  3
  •   Paul Alexander    16 年前

    它总是会变慢,因为它必须执行CPU总线锁定,而不仅仅是更新寄存器。然而,现代CPU实现了接近寄存器的性能,因此即使在实时处理中也可以忽略不计。

        6
  •  2
  •   MastsrOfDesaster    13 年前

    我的性能测试:

    挥发性物质:65174400

    锁:62428600

    联锁: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);
    });