Универсального ответа нет: вам придется профилировать код, сгенерированный вашей реализацией, чтобы знать наверняка.Однако в большинстве случаев, если eu_distance
находится в отдельной единице перевода и специально не аннотирован, компилятор не сможет знать, что его повторный вызов с одинаковыми аргументами даст одинаковые результаты;в этом случае вторая форма почти наверняка будет быстрее.С другой стороны, если eu_distance
может быть встроен, любой приличный оптимизатор в конечном итоге будет генерировать практически одинаковый код для обоих.
На практике я почти наверняка использовал бы третью форму:
min = std::min( eu_distance( point_a, point_b ), min );
(я полагаю, что eucl_distance
- это опечатка для eu_distance
.)
Кроме того, я бы избегал такого имени, как min
.Кто-то слишком вероятно может добавить using namespace std;
позже или даже включить <windows.h>
, без определения NOMINMAX
.(<windows.h>
определяет min
и max
как макросы, если NOMINMAX
не был определен. Это приводит к некоторым интересным сообщениям об ошибках, если вы определяете свои собственные min
или max
. Или даже включаете <algorithm>
.)
Относительно pow( x, 2 )
: опять же, вам действительно придется измерять, но обычно x * x
будет быстрее, даже если x
- сложное выражение.(Конечно, если выражение нетривиально, то признание того, что оба x
являются идентичными, может оказаться не таким простым, что затрудняет чтение кода. В таких случаях вам может потребоваться рассмотреть небольшую функцию, скажем squared
, который ничего не делает, кроме как возвращает x * x
. Вставьте его, если это влияет на производительность.)