сравнение производительности с помощью таблиц поиска триггеров - PullRequest
3 голосов
/ 15 сентября 2010

Мы разрабатываем систему реального времени, которая будет выполнять вычисления sin / cos в течение критического по времени периода работы. Мы рассматриваем возможность использования справочной таблицы, чтобы повысить производительность, и я пытаюсь сопоставить выгоды и затраты от внедрения таблицы. К сожалению, мы еще не знаем, какая степень точности нам понадобится, но, вероятно, около 5-6 знаков после запятой.

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

Спасибо!

Ответы [ 3 ]

2 голосов
/ 16 сентября 2010

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

1 голос
/ 16 сентября 2010

С какой точностью вы вводите градусы (давайте будем использовать градусы над радианами, чтобы обсуждение было «проще»).Десятки градуса?Сотые градусы?Если ваша угловая точность не велика, то ваш результат триггера не может быть лучше.

Я видел, что это реализовано как массив, индексированный с точностью до сотых долей градуса (сохраняя угол как целое число с двумя подразумеваемыми десятичными числами).Точка также помогает при расчете - не нужно использовать высокоточные поплавки / двойные радианные углы).

Хранить значения SIN от 0,00 до 90,00 градусов будут 9001 32-разрядными значениями результата с плавающей запятой.

SIN [0] = 0,0 ... SIN [4500] = 0,7071068 ... SIN [9000] = 1,0

Если у вас есть SIN, свойство триггера COS (a) = SIN (90-a)просто означает, что вы делаете SIN [9000-a], чтобы получить COS (a)

Если вам нужна большая точность, но у вас нет памяти для большего табличного пространства, вы можете выполнить линейную интерполяцию между двумя записями вмассив, например, SIN 45,00123 будет

SIN [4500] + 0,123 * (SIN [4501] - SIN [4500])

0 голосов
/ 16 сентября 2010

Единственный способ узнать характеристики производительности двух подходов - попробовать их .

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

Одна вещь, которую вы можете сделать, это поиск задержек инструкций в руководствах для вашего CPU. (Intel и AMD размещают эту информацию в формате PDF на своих веб-сайтах, а большинство других производителей процессоров имеют аналогичные документы)

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

Но это дает вам приблизительную оценку только одной стороны уравнения. Вы также можете сделать примерно такую ​​же приблизительную оценку стоимости таблицы поиска, если вы знаете задержки кэшей ЦП и имеете приблизительное представление о задержке обращений к памяти.

Но единственный способ получить точную информацию - это попробовать. Реализуйте оба и посмотрите, что произойдет в вашем приложении. Только тогда вы узнаете, что лучше в вашем случае.

...