Разница между "Math.DivRem" и оператором%? - PullRequest
21 голосов
/ 09 августа 2011

В чем разница между System.Math.DivRem() и оператором %?

Ответы [ 3 ]

26 голосов
/ 09 августа 2011

% дает вам остаток от деления и полностью отбрасывает частное, а DivRem() вычисляет и возвращает как частное, так и остаток.

Если вы толькообеспокоенный остатком от деления между двумя целыми числами, используйте %:

int remainder = 10 % 3;
Console.WriteLine(remainder); // 1

Если вам нужно знать, сколько раз 10 было разделено на 3, прежде чем иметь остаток от 1, используйте DivRem(),который возвращает частное и сохраняет остаток в выходном параметре:

int quotient, remainder;
quotient = Math.DivRem(10, 3, out remainder);
Console.WriteLine(quotient);  // 3
Console.WriteLine(remainder); // 1
8 голосов
/ 09 августа 2011

Это оптимизация. Некоторые процессоры могут вычислять оба значения одновременно. Другие процессоры не могут разделять аппаратные средства (и должны использовать очень медленные программные процедуры).

В любом случае (если у вас нет умного компилятора) вы можете в итоге вычислить одно и то же деление дважды. Поскольку деления никогда не бывают быстрыми на любом процессоре (даже если они реализованы на аппаратном уровне), использование Math.DivRem дает JIT хороший «совет» для вычисления значений только один раз.

iirc Mono не реализует эту оптимизацию, и я даже не уверен, что MS это делает.

6 голосов
/ 20 февраля 2014

Это могло бы быть оптимизацией, но, к сожалению, выдает тот же IL, что и деление PLUS операция мод.

На типичных архитектурах (x86 и друзья) их можно получить за одну операцию, но .NET JIT, похоже, не оптимизирует это (в моих тестах).

Итак, следующие два эквивалентны:

quotient = Math.DivRem(10, 3, out remainder);

VS:

quotient  = 10 / 3;
remainder = 10 % 3;

За исключением того, что последнее более читабельно.

Для справки: эта уродливая опция быстрее на x86 и x64:

quotient  = 10 / 3;
remainder = 10 - (3*quotient);

Надеемся, что когда-нибудь JIT улучшится, чтобы оптимизировать две операции в одну, поскольку это тривиально.

...