Умножьте на 0,5, а не разделите на 2

Пока я читал советы в c. Я видел этот совет здесь http://www.cprogramming.com/tips/tip/multiply-rather-than-divide но я не уверен. Мне сказали, что и умножение, и деление происходит медленнее и трудоемко и требует много циклов.

и я видел, что люди часто используют i << 2 вместо i x 4, так как перемещение выполняется быстрее.

Так помогите мне с этим. Это хороший совет, используя x0.5 or /2? или же современные компиляторы оптимизируют его лучше? Я хочу узнать мнения парней из stackoverflow.

Также вы могли бы разместить некоторые ссылки для полезных советов n ловушек в c. Любая помощь приветствуется.

Ответ 1

Верно, что некоторые (если не большинство) процессоры могут размножаться быстрее, чем выполнять деление. Но, как миф о ++i быстрее, чем i++ в цикле for. Да, это было когда-то, но в наши дни компиляторы достаточно умен, чтобы оптимизировать все эти вещи для вас, поэтому вам больше не нужно это делать.

И что касается смещения бит, то однажды было быстрее сдвинуть << 2, а затем умножить на 4, но в наши дни все процессоры могут размножаться за один такт, как операция переключения. Отличным примером этого был расчет адреса пикселя в режиме VGA 320x240. Они все это сделали:

address = x + (y << 8) + (y << 6)

умножить y на 320. На современных процессорах это на самом деле много раз медленнее, чем

address = x + y * 320;

Итак, просто напишите, что вы думаете, и компилятор сделает все остальное:)

Ответ 2

Я нахожу, что эта услуга неоценима для тестирования такого рода вещей:

http://gcc.godbolt.org/

Просто посмотрите на последнюю сборку. В 99% случаев вы увидите, что компилятор все равно оптимизирует его по одному и тому же коду. Не теряйте мозг!

В некоторых случаях лучше писать его явно. Например, 2^n (где n - положительное целое число) может быть записано как (int) pow( 2.0, n ), но, очевидно, лучше использовать 1<<n (и компилятор не сделает эту оптимизацию для вас). Так что это может стоить держать эти вещи в глубине вашего разума. Как и в случае с чем-либо, не оптимизируйте преждевременно.

Ответ 3

Многие процессоры могут выполнять умножение в 1 или 2 тактовых циклах, но деление всегда занимает больше времени (хотя разделение FP иногда быстрее, чем целочисленное деление).

Если вы посмотрите на этот ответ Как сравнить эффективность работы журнала() и fp-деления в С++?, вы увидите, что разделение может превышать 24 цикла.

Почему деление занимает гораздо больше времени, чем умножение? Если вы помните назад в старшую школу, вы можете вспомнить, что умножение может быть выполнено с помощью многих одновременных дополнений. Отдел требует итеративного вычитания, которое невозможно выполнить одновременно, поэтому требуется больше времени. Фактически, некоторые единицы FP ускоряют деление, выполняя обратное приближение и умножая на это. Это не совсем точно, но несколько быстрее.

Ответ 4

Если вы работаете с целыми числами, и вы ожидаете получить целое число в качестве результата, лучше использовать / 2, таким образом избегайте ненужных преобразований в/из float

Ответ 5

  • "умножить на 0,5 вместо деления на 2" (2.0) быстрее на меньшее количество окружений в эти дни, чем раньше, в основном из-за улучшения компиляторов, которые будут оптимизировать код.

  • "использовать я < 2 вместо я x 4" быстрее в меньшем числе сред по аналогичным причинам.

  • В некоторых случаях программисту по-прежнему необходимо следить за такими проблемами, но это становится все реже. Код обслуживание продолжает расти как доминирующая проблема. Поэтому используйте то, что наиболее полезно для этого фрагмента кода: x*0.5, x/2.0, half(x) и т.д.

  • Составители легко оптимизируют код. Рекомендовать код с учетом проблем высокого уровня. E. g. Является ли алгоритм O (n) или O (n * n)?

  • Важная мысль, которая должна пройти, заключается в том, что лучшие методы разработки кода развиваются, а изменения происходят между средами. Быть адаптируемым. То, что лучше всего сегодня, может сместиться (или размножаться) в будущем.