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)
我选择编辑实例本身(如果这违反了指南)而不是返回一个新实例,因为这也需要相当长的时间.
这个结构将非常频繁地增加,因此我正在寻找增加处理时间的原因.
这只是抖动有多聪明的问题.对于常规的本地int变量,语句
x++;
Run Code Online (Sandbox Code Playgroud)
在许多情况下,可以将其简化为单个机器指令,因为可以注册本地变量.如果它没有被注册,那么指令序列将加载值,增加它并存储它,所以一些指令.
但是++在结构上重载具有以下语义.假设我们有结构s,我们说s++.这意味着我们有效地实施
s = S.operator++(s);
Run Code Online (Sandbox Code Playgroud)
那是做什么的?
s作为新形式参数的局部变量位置创建副本恢复上一个激活帧的状态
将返回的值复制到的位置s.
因此,您的快速程序正在执行第4步.您的慢速程序正在执行步骤1到8,并且速度大约慢8倍.抖动可以确定这是一个内联的候选者并且摆脱了一些成本,但它绝不是必需的,并且有很多理由可以选择不内联.抖动并不知道这个增量对你很重要.
| 归档时间: |
|
| 查看次数: |
276 次 |
| 最近记录: |