使用模数与循环限制旋转

时间:2014-01-23 21:09:40

标签: c# optimization rotation

在将单元测试添加到遗留代码时,我发现了这个结构:

    double rotationX = Math.Abs(newRotationX % 360 + 360) % 360;

它基本上强制旋转为[0, 360)范围内的值。否定数字变为正数(-1应变为359),大数量有限(725应变为5)。

循环会更有效吗?

double rotationX = newRotation;
while (rotationX < 0)
    rotationX += 360;
while (rotationX >= 360)
    rotationX -= 360;

......甚至只使用一个%

double rotationX = newRotation % 360; // Value can be -359..359
if (rotationX < 0)
    rotationX += 360; // Negative values are now > 0

2 个答案:

答案 0 :(得分:1)

这似乎是一个非常小的问题,编译器可能会尽力优化它。

如果它真的漂浮在你的船上,你可以快速模拟测试和基准测试,但有很多东西需要记住才能使其有效,这可能是不值得的。

此外:

过早优化是邪恶帖子和文章的根源:

我猜你的遗留代码可能有更好的事情需要担心:)

答案 1 :(得分:0)

在我看来,Math.Abs调用是不必要的,因为负数的模数将得到-359和0之间的值,然后在此基础上加上360,你将处于正数范围。最终模数360需要保持以处理不需要添加360的正数。在执行此操作时,您将删除堆栈中的一个调用。

var rotationX = 
    (newRotationX % 360 + 360) // puts any negative number into the positive range
    % 360; // puts any positive numbers back into the 0-359 range

如第二个例子中那样下降到单模运算,可能会更加优化。但是你真的需要对你的代码进行分析,以确定哪个选项表现最佳。