Умножьте на 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)?
-
Важная мысль, которая должна пройти, заключается в том, что лучшие методы разработки кода развиваются, а изменения происходят между средами. Быть адаптируемым. То, что лучше всего сегодня, может сместиться (или размножаться) в будущем.