Рубрики
Без рубрики

Исследуя миф: расчет квадратного корня дорого

Я знаю этот любопытный факт о разработке игр, который говорит, где это возможно, никогда не использовать величину … Теги с unity3d, узел, python, dotnet.

Я знаю этот любопытный факт о разработке игр, который говорит, где это возможно, никогда не использовать величину вектора (если не требуется), потому что он включает в себя вычисление дорогостоящего корневого корня. Даже Unity Documentation подтверждает это понятие. Что интересно, в том, что я никогда не узнал об этом, и я действительно вижу, что это плавало вокруг Интернета, совсем недавно на Reddit. Похоже, одна из тех вещей, которые начинают разрабатыватели игры участвовать через осмос.

Это один из тех высказываний, которые имеют смысл на поверхности Но я хотел копаться на том, насколько медленнее операция квадратного корня была, и если у него было какое-либо значимое влияние на производительность в том, что я бы считал «нормальным» обстоятельствами.

Когда программисты говорят о стоимости операции, они обычно означают, сколько инструкций требуется для выполнения операции. Например, умножение обычно потребуется три инструкции, два чтения и одна запись. Для более сложных операций (таких как разделение) часто требуется еще много шагов для расчета точного представления результата, таким образом, расходы в операции. В то время как квадратный корень, возможно, когда-то был чрезвычайно дорогостоящим упражнением, у меня есть догадка, что теперь это гораздо менее актуальный совет, чем раньше. Кроме того, он ведет новые программисты, чтобы сосредоточиться на изменении того, как они пишут код, чтобы оптимизировать указанный код, как они идут. Я большой верующий в написании чистого, многословного кода и оптимизации только тогда, когда он абсолютно необходимо. Это может быть сложно, как новый программисты, где вы часто хотите написать очиститель и более эффективный код, чем ваша последняя попытка решения такой же проблемы. Это дает вам признак того, что вы продвигаетесь и позволяют решать большие проблемы.

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

Эксперимент

Выполните 1000 петель 1 000 000 расчетов (да в общей сложности 1 000 000 000 расчетов). Запишите минимальное, максимальное и среднее время, которое потребовалось для завершения каждого из этих петель в «реальном мире». Каждая петля состояла из квадратных корневых расчетов, умножая целевую переменную самостоятельно, либо поднимая ту же целевую переменную к мощности 2.

Я не слишком беспокоит, как долго любая любая из этих операций. Мне не волнует самое быстрое время, я забочусь о пропорциональном времени между операциями. Вероятность вот что я вполне могу быть в состоянии получить более быстрые времена, учитывая разные настройки. В качестве примера все было запущено в режиме отладки на машине Windows, это, вероятно, повлияет на общее время, необходимое для завершения каждой задачи. Возьмите фактические значения с зерном соли, мы можем сравнить интересные детали дальше. Чтобы увидеть код, который я использовал для проведения тестов, проверьте моиги здесь Отказ Если вы хотите краткий обзор кода, я проверял, это действительно все сводится к сравнению ниже.

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

Я также добавил некоторые определенные тесты единства, ориентируясь на Вектор3.magnitue против Вектор3.sqrmagnitue Как и еще одна метрика, которым судить, потому что довольно откровенно, это важнее для меня как преимущественно единство-разработчика.

Чтобы убедиться, что этот миф не является языком, который я тестировал в Dotnet Core 2.1 С Unity 2018.2.14f1 .Net. 3.5 эквивалент , Узел 8,9.0 и Python 2.7.15. . Для справки я тестирую на Windows 10 на CPU I7 8750-H.

Результаты

Как упоминалось выше, я проверяю, что этот миф существует на языках программирования. Однако я не хочу сравнивать между языками программирования, потому что скорость языка в целом не беспокоит меня. Давайте посмотрим, как каждый выступал каждый язык.

Эти результаты показывают нам, что существует небольшая разница в скорости вычисления квадратного корня по сравнению с простом умножением нашего целевого значения. В C # функция питания была значительно медленнее в среднем, чем подходы квадратного корня и умножения. Мы могли бы легко написать код, который выполняет хуже, чем просто, используя наш квадратный корневой расчет для начала. Последнее также бывает легче читать код.

Игнорируя тот факт, что выполнение вектора математики в среднем медленнее, чем поплавка математики, которую я ожидал, проверка операции величины не было намного медленнее, чем проверка квадратной величины.

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

Мы видим, что в случае единства это значительно лучше, 2,5x на самом деле, использовать умножение по сравнению с использованием квадратного корня. Другие языки, однако, все это скромно отличаются, если мы используем любой подход для разумного количества расчетов, мы вряд ли увидим серьезное узкое место в производительности.

В лучшем случае, при 2.5x лучшим характеристиком для умножения, в каких родах мы могли бы увидеть? За операцию, то есть для одного квадратного корня, мы могли бы сохранить колоссальный 0,033173 микросеконд . Если мы вместо этого старались быть умными и поднять нашу целевую целевую ценность к власти двух, мы бы значительно усугубились, однако мы все равно будем только добавлять 0,157795 микросеконд . Нет сомнений в том, что выполнение вектора математики будет иметь накладные расходы из-за двух измерений, но выполнение проверки на квадратной величине вместо величины только сетки повышение производительности 0,051819 микросекунды Отказ

Последние мысли

Вышеуказанное является классическим случаем микрооптимизации. На бумаге кажется удивительным, чтобы написать код, который 2,5x быстрее. Но это происходит за счет некоторой читаемости, а также отладки, для довольно минимальной прирост производительности. Технически квадратный корень медленнее, чем умножение нашего целевого значения сама по себе, но практически я не совсем уверен, а не для типичных случаев использования. Если вы новичок в программировании, все в порядке, чтобы изучать эти предметы информации и держать их спрятаны. С этим говорим, что вам не нужно бросать их, используя их, когда вы можете упростить вашу математику. Проверка против чего-то такого как величина будет легче для вас, или ваших коллег, чтобы отладить позже.

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

В качестве последней ноты, я нашел скорость, выходящие из единства в целом действительно интересно. Из всех языков я ожидал, что корневой подход Unity является одним из самых быстрых через доску. Учитывая язык, предназначенный для разработки игры, я ожидал, что немного менее точный поплавок с преимуществом скорости. Это просто не было так здесь. Мой совет, получите функцию и оптимизируйте ее, как только вы знаете, это проблема.

Оригинал: “https://dev.to/iamscottcab/exploring-the-myth-calculating-square-root-is-expensive-44ka”