Производительность вычислительных констант
Как соотносятся следующие два блока псевдокода с точки зрения скорости как для скомпилированных, так и для интерпретируемых языков? (Игнорируя количество цифр)
По сути, есть ли потеря производительности при записи переменных как функции нескольких констант, а не при предварительном вычислении? Это часто делает код более понятным.
permanentNum = (3.1416 / 3) + 1.5708
return permanentNumber / userInputNumber
,
permanentNum = 2.6179
return permanentNumber / userInputNumber
Спасибо!
3 ответа
Комментарий Митча Уитэта абсолютно верен; оптимизация - это то, что нужно делать после того, как у вас есть четкий и правильный код, и только когда это необходимо
Чтобы ответить на вопрос, однако, это, очевидно, зависит от языка. Любой достойный компилятор для C-подобных языков имеет проход оптимизации с постоянным сворачиванием. В GCC, Oracle Javac или любом широко используемом компиляторе ваши два примера будут генерировать один и тот же код.
Интерпретируемые языки, вероятно, достаточно медленные, поэтому стоимость нескольких дополнительных арифметических операций не является вашим узким местом, независимо от того, выполняется ли это постоянное свертывание во время разбора или нет.:-)
Начните со стремления к ясности кода.
Затем измерьте производительность. Если есть проблемы с производительностью, выявите узкие места.
Любые узкие места весьма маловероятны при назначении констант (скомпилированный или интерпретированный код).
Компиляторы обычно оптимизируют подобные константы, поэтому даже если вы напишите (3.1416 / 3) + 1.5708
значение, которое окажется в вашем объектном коде 2.6179
, Переводчики могут делать то же самое, но поскольку они делают это во время выполнения, то да, производительность будет ниже.
Тем не менее, разница, вероятно, будет незначительной, поэтому, как сказал Митч Уит, вы должны отдавать предпочтение ясности кода. Теоретический анализ - это одно, но единственный способ убедиться в том, что является узкими местами в вашем конкретном коде (в вашей конкретной среде), - это тестирование, профилирование, измерение.