为什么重载++需要比仅递增值更长的时间?

Den*_*901 0 c# operator-overloading

为什么递增一个(在我的情况下)Uint一个100.000.000次需要~0.175秒,而在结构中增加一个Uint相同的时间需要~1.21秒?

测试大约进行了10次,结果几乎相同.如果它无法帮助,那就这样吧.但我想知道是什么原因造成的.时间的增加是相当重要的.下面的运算符重载是使用的确切代码:

private uint _num;        
public static Seq operator ++(Seq a)
{
    a._num++; return a;
}
Run Code Online (Sandbox Code Playgroud)

我选择编辑实例本身(如果这违反了指南)而不是返回一个新实例,因为这也需要相当长的时间.

这个结构将非常频繁地增加,因此我正在寻找增加处理时间的原因.

Eri*_*ert 8

这只是抖动有多聪明的问题.对于常规的本地int变量,语句

x++;
Run Code Online (Sandbox Code Playgroud)

在许多情况下,可以将其简化为单个机器指令,因为可以注册本地变量.如果它没有被注册,那么指令序列将加载值,增加它并存储它,所以一些指令.

但是++在结构上重载具有以下语义.假设我们有结构s,我们说s++.这意味着我们有效地实施

s = S.operator++(s);
Run Code Online (Sandbox Code Playgroud)

那是做什么的?

  1. s作为新形式参数的局部变量位置创建副本
  2. 存储将被被调用者覆盖的任何寄存器状态
  3. 执行调用指令
  4. 加载形式的值,增加它,存储它
  5. 将新值复制到为返回值保留的位置
  6. 执行返回指令
  7. 恢复上一个激活帧的状态

  8. 将返回的值复制到的位置s.

因此,您的快速程序正在执行第4步.您的慢速程序正在执行步骤1到8,并且速度大约慢8倍.抖动可以确定这是一个内联的候选者并且摆脱了一些成本,但它绝不是必需的,并且有很多理由可以选择不内联.抖动并不知道这个增量对你很重要.