System.Math.DivRem()
和%
运算符之间有什么区别?
答案 0 :(得分:26)
%
为您提供除法的余数并完全丢弃商,而DivRem()
计算并返回 商和余数。
如果您只关心两个整数之间的余数,请使用%
:
int remainder = 10 % 3;
Console.WriteLine(remainder); // 1
如果您需要知道在余数为1之前10被除以3的次数,请使用DivRem()
,它返回商并将余数存储在out参数中:
int quotient, remainder;
quotient = Math.DivRem(10, 3, out remainder);
Console.WriteLine(quotient); // 3
Console.WriteLine(remainder); // 1
答案 1 :(得分:8)
这是一项优化。某些处理器能够同时计算这两个值。其他处理器不能分为硬件(并且必须使用非常慢的软件例程)。
在任何一种情况下(除非你有一个智能编译器),你最终可能会计算两次相同的分区。由于在任何处理器上(即使在硬件中实现),分区永远不会很快,因此使用Math.DivRem可以为JIT提供一个很好的“提示”来仅计算一次值。
iirc Mono没有实现这种优化,我甚至不确定MS是否这样做。
答案 2 :(得分:5)
可以进行优化,但不幸的是,它产生的IL与分区 PLUS 的mod操作相同。
在典型的体系结构(x86和朋友)上,这两者可以从单个操作中获得,但.NET JIT似乎没有优化(在我的测试中)。
所以以下两个是等价的:
quotient = Math.DivRem(10, 3, out remainder);
VS
quotient = 10 / 3;
remainder = 10 % 3;
除了后者更具可读性。
对于记录,这个丑陋的选项在x86& 64:
quotient = 10 / 3;
remainder = 10 - (3*quotient);
希望JIT有一天能够将两个操作优化为一个,因为它很简单。