Вопрос

Я пишу приложение для iPhone, которое необходимо рассчитать квадратный корень из ряда около 2000 раз каждые 1/30 секунды. SQRT () работает нормально на компьютере, но скорость кадров падает до 10 кадров в секунду на iPhone или iPad, и я уже оптимизировал остальную часть кода. Я слышал, что это может резко поправиться, оценивая квадратный корень, но не могу найти какой-либо код для этого. Мне нужны только одно или два десятичных места точности. Любые предложения о том, как это сделать или другие способы ускорить вещи, будут оценены.

Спасибо!

Это было полезно?

Решение

Насколько точно вы хотите, чтобы ваша оценка была? Если вы знаете, насколько близко вы хотите, чтобы ваша оценка была до настоящего SQRT Метод Ньютона твой друг.

Знаете ли вы диапазон значений, которые передаются на SQRT? Если это так, вы можете составить таблицу Seep Up, которая предварительно проводит при запуске (или даже читается с диска при запуске в зависимости от того, что оказывается быстрее). Найдите ближайший в таблице на свой вклад, и вы получите свою оценку.

Другие советы

Если вы, если вы на самом деле нужно Квадратный корень, сравните квадратные значения, а не сырые значения и квадратный корень.

Квадрат намного быстрее (и точнее), чем принимать квадратный корень, если вам нужно только сравнение. Это то, как большинство игр делают это.

Знаете ли вы диапазон ценностей, которые вы пытаетесь найти квадратный корень? Скажем, у вас есть значения, начиная от 0 до 10. Затем вы можете предварительно получить массив:

sqrt_val[0] = 0;
sqrt_val[1] = 1;
sqrt_val[2] = // the sqrt of 2
...
sqrt_val[10] = // the sqrt of 10

Затем во время выполнения вы принимаете номер, который вы хотите, чтобы SQRT преобразуйте, что в целое число (так, например, 3.123 становится 3) и используйте это в качестве индекса (3), чтобы посмотреть предварительное значение.

Конечно, если вы хотите более тонкое разрешение, вы можете просто увеличить количество предметов в вашем массиве.

Во-первых, вы уверены, что квадратный корень на самом деле является узким местом? Вы профилировали? 2000 квадратных корней каждые 1/30 секунды на самом деле не все, что многие даже на мобильном телефоне. Документация ARM цитаты 33 циклов для одноточного квадратного корня и 60 циклов для двойной точности; Процессор 600 МГц может сделать 10 миллионов Квадратные корни в секунду (больше, если инструкция вообще проводится трубопровод).

Если вы профилировали, и квадратный корню действительно есть узкое место, вы захотите использовать неон vrsqrte.f32 Инструкция. Эта инструкция довольно быстрая и дает вам приблизительные взаимные квадратные корни четырех номеров с плавающей точкой одновременно. Затем вы можете использовать vmul.f32 Инструкция по приобретению приблизительных квадратных корней (хотя для многих используемых взаимных более полезных, чем сам квадратный корень).

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

Самое простое изменение, которое вы можете сделать на iPhone, это использовать SQRTF () вместо SQRT (). Единственная точность Float Math намного быстрее, чем двойная точность, особенно на устройствах 3GS Vintage и новее.

Если вам нужен квадратный корень для расчета треугольника Pythagoras (SQRT (X * X + Y * Y)), и оба X и Y являются неотрицательными, то очень быстрое приближение к этому

max(x,y) + min(x,y)*0.333

Это имеет максимальную ошибку на 5,7%. Следите за неправильной передачей ветви в мин () и MAX (), хотя.

Если у вас есть «нормальный» положительный поплавок или двойной, а не INT, и хотите использовать метод поиска таблиц, вы можете сделать два отдельных таблице-дисплеи, один для экспоненты (повторной смещенной) и один для Несколько кусков Mantissa (смена и маска для добычи битового поля), а затем умножьте на двух таблице смотреть результаты вместе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top