2016-05-30 5 views
0

При вычислении расстояния между двумя 3D-точками в Java я могу вычислить расстояние или расстояние между ними, избегая вызова в Math.sqrt.Фактические эксплуатационные преимущества квадрата расстояния и расстояния

Наоборот, я читал, что sqrt - это только четверть скорости умножения, что делает неудобство использования квадрата расстояния не стоящим.

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

+2

Единственный способ ответить на это «абсолютно» является эталоном разница в коде. [Обязательная ссылка] (http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java) –

+0

Мои тесты показывают, что 'dx * dx + dy * dy 'выполняется примерно в два раза быстрее, чем' Math.sqrt (dx * dx + dy * dy) '. Вы упомянули * «четверть скорости» *, что означает разницу в 4 раза. Если в 2 или 4 раза быстрее вас не интересует, то это не имеет значения, не так ли? В общей схеме вещей это имеет значение только в том случае, если вы делаете это * много *. ** Остерегайтесь преждевременной оптимизации. ** Исправьте это, если вы измеряете проблему, не сверните свой код на основе (ошибочных?) Предположений о производительности. – Andreas

+0

Вычисление расстояния занимает квадратный корень квадратного расстояния. Нет никакого компромисса, квадратный корень - чистый накладные расходы. Как бы долго это ни потребовалось, это время, когда вычисление нормального расстояния занимает дополнительное сравнительное квадратное расстояние. – harold

ответ

0

Я Изначально хотел бы добавить это в качестве комментария, но он начал получать слишком ставки, так что здесь идет:

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

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

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

PS: Предоставлять больше кода, если вы хотите более «практическую» ответ