Существует более быстрый способ сделать это, если вы знаете диапазоны значений, например, если вы делите целое число со знаком на 3 и знаете, что диапазон значения, которое нужно разделить, составляет от 0 до 768, то вы можно умножить его на коэффициент и сдвинуть влево на степень 2 к этому коэффициенту, деленному на 3.
например.
Диапазон 0 -> 768
вы можете использовать сдвиг 10 битов, который умножая на 1024, вы хотите разделить на 3, чтобы ваш множитель был 1024/3 = 341,
, так что теперь вы можете использовать (x * 341) >> 10
(Убедитесь, что сдвиг является сдвигом со знаком, если используются целые числа со знаком), также убедитесь, что сдвиг действительно сдвиг, а не бит ROLL
Это эффективно разделит значение 3 и будет работать примерно в 1,6 раза быстрее, чем естественное деление на 3 на стандартном процессоре x86 / x64.
Конечно, единственная причина, по которой вы можете выполнить эту оптимизацию, когда компилятор не может этого сделать, заключается в том, что компилятор не знает максимального диапазона X и, следовательно, не может сделать это определение, но вы, как программист, можете.
Иногда может быть даже выгоднее переместить значение в большее значение, а затем сделать то же самое, т.е. если у вас есть int полного диапазона, вы можете сделать его 64-битным значением, а затем сделать умножение и сдвиг вместо деления на 3.
Мне пришлось сделать это недавно, чтобы ускорить обработку изображений, мне нужно было найти среднее из 3 цветовых каналов, каждый из которых имеет диапазон байтов (0 - 255). красный зеленый и синий.
Сначала я просто использовал:
avg = (r + g + b) / 3;
(Таким образом, r + g + b имеет максимум 768 и минимум 0, потому что каждый канал является байтом 0 - 255)
После миллионов итераций вся операция заняла 36 миллисекунд.
Я изменил строку на:
avg = (r + g + b) * 341 >> 10;
И это заняло 22 миллисекунды, это удивительно, что можно сделать с небольшой изобретательностью.
Это ускорение произошло в C #, хотя у меня были включены оптимизации и я запускал программу без отладочной информации и без встроенной среды.