在将单元测试添加到遗留代码时,我发现了这个结构:
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
答案 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
如第二个例子中那样下降到单模运算,可能会更加优化。但是你真的需要对你的代码进行分析,以确定哪个选项表现最佳。