Переопределение функции с помощью лямбды или вызов стандартного API (Math.Ceiling) - PullRequest
2 голосов
/ 13 декабря 2011

Я хочу вычислить потолок деление строго положительных целых чисел. У меня есть выбор между следующими двумя реализациями:

var ceil = new Func<int, int, int>((a, b) => a % b > 0 ? a / b + 1 : a / b);
var x = ceil(y, z); // y and z being int previously defined

и

var x = (int)Math.Ceiling((double)y / (double)z);

Эта вторая версия (Math.Ceiling) выглядит точно так же, как и первая (с лямбдой), но с добавлением 3-х преобразований. Поэтому я чувствую, что использую первый. Я что-то упустил?

(отредактировано для уточнения того факта, что оно имеет дело только со строго положительными целыми числами)

Ответы [ 2 ]

6 голосов
/ 13 декабря 2011

Лично я бы не стал беспокоиться об оптимизации конверсий int -> double, это, как правило, меньше всего беспокоит вас по поводу производительности. Да, они могут складываться, но вам нужно много работать в тесном цикле или что-то подобное.

Я бы придерживался Math.Ceiling(), поскольку совершенно очевидно, что вы пытаетесь сделать, и, следовательно, его легче поддерживать. Если вы обнаружите, что ваш код работает медленно, то сначала оптимизируйте и атакуйте самые большие проблемы.

Синхронизация этих более чем 1 миллиардов итераций составляет 8 677 мс для лямбды и 9 749 мс для Math.Ceiling(), но это 0,0000087 мс против 0,0000097 мс на вызов, что незначительно.

0 голосов
/ 13 декабря 2011

Нет причин использовать лямбду вместо метода.

Второй вариант немного уродлив: вы полагаетесь на деление с плавающей запятой, чтобы получить точный результат, когда дивиденд является целым кратным делителя. Хотя я не могу вспомнить ситуацию с 32-битными целыми числами и двойным, когда это не так, это все равно вызывает у меня плохое предчувствие. И если позже вы замените Int32 на Int64, это внезапно перестанет быть правильным.

Просто определите новый нормальный метод:

public static int IntDivisionCeiling(int dividend, int divisor)
{
  int quotient=dividend/divisor;
  if(dividend%divisor>0)
    return quotient;
  else
    return quotient+1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...