Имеет ли ACOS, Atan функции в STL использует много циклов процессора - PullRequest
3 голосов
/ 02 июня 2010

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

Ответы [ 4 ]

10 голосов
/ 02 июня 2010

В STL таких функций нет; те в математической библиотеке.

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

Чтобы дать совет, что вы собираетесь с ним делать? Насколько точным оно должно быть?

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

В любом случае, после того, как вы выполнили то, что вы собираетесь делать, сделайте до и после прогона времени, чтобы увидеть, если вы что-то изменили.

2 голосов
/ 02 июня 2010

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

Серия Арккос Тейлор

Серия Арктан Тейлор

2 голосов
/ 02 июня 2010

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

1 голос
/ 02 июня 2010

Реализации atan и acos зависят от компилятора и настроек оптимизации. Многие реализации будут использовать таблицу и интерполировать для получения ближайшего значения.

Попробуйте сначала это:

  1. Профиль приложения, чтобы найти где большая часть времени выполнения израсходованы.
  2. Редизайн этой области для лучшего производительность.
  3. Рассмотрим Дизайн, управляемый данными методы для ускорения вашей программы.
  4. Изменение логики для уменьшения веток и если заявления, рассмотреть вопрос об использовании Карты Карно для упрощения логика.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...