Фактические преимущества производительности квадрата расстояния по сравнению с расстоянием

При вычислении расстояния между двумя трехмерными точками в Java я могу вычислить расстояние или квадрат расстояния между ними, избегая вызова Math.sqrt.

Изначально я читал, что sqrt составляет только четверть скорости умножения, что делает неудобство использования квадрата расстояния нецелесообразным.

В Java, какова абсолютная разница в производительности между умножением и вычислением квадратного корня?


person konsolas    schedule 30.05.2016    source источник
comment
Единственный способ ответить на этот вопрос абсолютно — сравнить разницу в вашем коде. Обязательная ссылка   -  person Andy Turner    schedule 30.05.2016
comment
Мои тесты показывают, что dx * dx + dy * dy работает примерно в два раза быстрее, чем Math.sqrt(dx * dx + dy * dy). Вы упомянули четверть скорости, что означает разницу в 4 раза. Если вас не волнует ускорение в 2 или 4 раза, то это не имеет значения, не так ли? В общем случае это имеет значение только в том случае, если вы делаете это много. Остерегайтесь преждевременной оптимизации. Исправляйте ее, если измеряете проблему, не усложняйте свой код на основе (ошибочных?) предположений о производительности.   -  person Andreas    schedule 30.05.2016
comment
Вычисление расстояния — это извлечение квадратного корня из квадрата расстояния. Здесь нет компромисса, квадратный корень — это накладные расходы. Сколько бы времени это ни заняло, это время, за которое вычисление нормального расстояния занимает дополнительное по сравнению с квадратом расстояние.   -  person harold    schedule 30.05.2016
comment
Вы должны сначала рассмотреть, какое решение является правильным, а затем оптимизировать его, основываясь на том, какой код занимает больше всего времени на основе измерений, а не предположений, например. с помощью профайлера. В противном случае вы можете потратить много времени на оптимизацию кода, что никак не повлияет на общую производительность ваших приложений.   -  person Peter Lawrey    schedule 30.05.2016


Ответы (1)


Сначала я хотел добавить это в качестве комментария, но стало слишком много ставок, так что вот:

Попробуй сам. Создайте цикл с 10 000 итераций, в котором вы просто вычисляете a*a + b*b, и еще один отдельный цикл, в котором вы вычисляете Math.sqrt(a*a + b*a). Время это, и вы будете знать. Вычисление square root представляет собой итеративный процесс сам по себе, в котором цифровой (компьютерных битов) квадратный корень сходится ближе к реальному квадратному корню заданного числа, пока он не станет достаточно близким (как только разница между каждой итерацией станет меньше некоторого действительно небольшого значения ). Помимо того, что использует библиотека Math, существует несколько алгоритмов, и их скорость зависит от входных данных и от того, как разработан алгоритм. По моему мнению, остановитесь на Math.sqrt(...), вы не ошибетесь, и это было проверено МНОЖЕСТВОМ людей.

Хотя это можно сделать очень быстро для одного квадратного корня, существует определенная наблюдаемая разница во времени.

На заметку: я не могу придумать причину для вычисления квадратного корня более одного раза, обычно в конце. Если вы хотите узнать расстояние между точками, просто используйте квадратное значение этого расстояния по умолчанию и выполняйте сравнения/суммирование/вычитание или все, что вы хотите, на основе этого значения по умолчанию.

PS: предоставьте больше кода, если вам нужен более «практичный» ответ.

person Roel Strolenberg    schedule 30.05.2016