#cpp #оптимизация
Какая функция быстрее работает? templateT abs(T n) {return n<0 ? -n : n;} или template T abs(T n) {return n*(n<0 ? -1 : 1);}
Ответы
Ответ 1
Прежде чем ответить, отдельно замечу, что вам эта информация ничем не поможет. Почему? Это шаблон. Он будет инстанцирован для каждого типа отдельно, поэтому результат сильно зависит от типа (код может и вовсе не скомпилироваться с некоторыми типами). Хотите сравнивать -- скажите, какой тип вас интересует. А я поведу себя, как С, и предположу int. abs есть в стандартной библиотеке, и есть основания думать, что он максимально эффективен. Это микрооптимизация, эффект от которой на общем времени программы вы вряд ли заметите. Скажем так -- время, которое вы этим сэкономите, скорее всего, в сумме по всем пользователям за всё время существования вашей программы не превысит даже то время, что я писал этот ответ. :) Но давайте проверим с int: typedef int T; T abs(T n) {return n<0 ? -n : n;} T abs2(T n) {return n*(n<0 ? -1 : 1);} Результат на x86 GCC 5.3.0 с флагом -O3: abs(int): movl %edi, %edx movl %edi, %eax sarl $31, %edx xorl %edx, %eax subl %edx, %eax ret abs2(int): movl %edi, %eax sarl $31, %eax orl $1, %eax imull %edi, %eax ret Код всё-таки разный. Как видите, второй вариант короче. Значит ли это, что он быстрее? Не факт. Результат зависит от реализации в процессоре, но умножение технически сложнее вычитания, поэтому выполняется чуть дольше. Но это всё про int. Можете проверить и другие интересующие вас типы, просто подставив его в typedef в этом же инструменте. Но на вопросы "что быстрее" ответ всегда один -- измерьте!Ответ 2
При включенном оптимизаторе будет генерироваться одинаковый код, за исключением случаев когда operator* перегружен.Ответ 3
Очевидно, что второе не может быть быстрее, поскольку оно содержит больше операций, чем первое. Однако, весьма вероятно, что компилятор умный и сам подчистит оба варианта до оптимального.
Комментариев нет:
Отправить комментарий