Я начинаю с программирования dsp прямо сейчас, и я пишу свои первые классы и функции низкого уровня. Поскольку я хочу, чтобы функции были быстрыми (или, наконец, неэффективными), я часто задаюсь вопросом, что я должен использовать, и чего я должен избегать в функциях, которые вызываются на выборку.Производительность DSP, чего следует избегать?
Я знаю, что скорость обучения меняется совсем немного, но я думаю, что некоторые из вас по крайней мере могут использовать эмпирическое правило или просто испытать. :)
условные операторы
Если я должен использовать условия, switch
должен быть быстрее, чем if/else if
блок, правильно? Существуют ли различия между использованием двух if
-значений или if-else
? Где-то я читал, что следует избегать else
, но я не знаю, почему.
Кроме того, по сравнению с умножением, есть ли грубая оценка того, сколько времени занимает if-блок? Потому что в некоторых случаях, с помощью умножения на ноле могут быть использованы вместо если-заявлений:
//something could be an int either 1 or 0:
if(something) {
signal += something_else;
}
// or:
signa+ += something*something_else;
функция и функция-указатели
Вместо использования условных выражений, вы можете использовать функцию-указатель. Вместо использования условий в каждом вызове указатель может быть перенаправлен на определенную функцию. Однако для каждого вызова указатель должен был интерпретироваться, чтобы вызвать нужную функцию. Поэтому я не знаю, помогло бы это или нет.
Я также задаюсь вопросом, влияет ли функция вызова. Если это так, следует избегать бокс-функций, правильно?
переменных
Я думаю, что определение и использование многих переменных в функции не действительно оказывает влияние, по крайней мере, по отношению к расчетам. Это правда? Если нет, повторное использование объявленных переменных будет лучше, чем больше декларации.
расчеты Есть ли порядок расчета типов с точки зрения времени их выполнения? Я уверен, что это сильно зависит от контекста, но эмпирическое правило будет приятным. Я часто читал, что люди считают только умножение в алгоритме. Это потому, что дополнения происходят быстро? Имеет ли разница между умножением и делением? (*0.5
или /2.0
)
Я надеюсь, что вы сможете поделиться опытом использования soem.
Приветствия
Внедрите сначала, оптимизируйте второй. То есть, не беспокойтесь о производительности, пока у вас не будет рабочего кода.Затем проанализируйте свой рабочий код и оптимизируйте узкие места. – dohashi
В настоящее время с комплексными оптимизирующими компиляторами единственный реальный способ ответить на этот вопрос - сообщить вам профиль. Компилятор обычно «знает», чтобы преобразовать деление с плавающей запятой в умножение, если это возможно, и с предсказанием ветвления и т. Д. На современных процессорах, сложно ответить на ваш вопрос общим, полезным способом. –
Как я уже сказал, я не начну сжимать наносекунды из своего алгоритма, но для разработки классов и функций некоторые базовые правила действительно помогут. :) –