【发布时间】:2014-10-28 00:51:59
【问题描述】:
我现在开始使用 dsp 编程,并且正在编写我的第一个低级类和函数。 由于我希望函数快速(或最终不会低效),我经常想知道在每个样本调用的函数中应该使用什么以及应该避免什么。
我知道指令的速度变化很大,但我认为你们中的一些人至少可以分享经验法则或只是经验。 :)
条件语句
如果我必须使用条件,switch 应该比if / else if 块快,对吧?
使用两个if-statements 或一个if-else 之间有区别吗?我在某处读到应该避免使用else,但我不知道为什么。
此外,与乘法相比,是否粗略估计 if 块需要多长时间?因为在某些情况下,可以使用乘以零来代替 if 语句:
//something could be an int either 1 or 0:
if(something) {
signal += something_else;
}
// or:
signa+ += something*something_else;
函数和函数指针
您可以使用函数指针,而不是使用条件语句。可以将指针重定向到特定函数,而不是在每次调用中使用条件。但是,对于每次调用,都必须解释指针才能调用正确的函数。所以我不知道这是否有帮助。
我还想知道调用函数是否会产生影响。如果是这样,应该避免拳击功能,对吧?
变量
我认为在函数中定义和使用许多变量并没有真正的影响,至少相对于计算而言。这是真的?如果没有,重用声明的变量会比更多的声明更好。
计算
计算类型的执行时间是否有顺序?我确信这在很大程度上取决于上下文,但经验法则会很好。我经常读到人们只计算算法中的乘法。这是因为添加真的很快吗?
乘法和除法有区别吗? (*0.5 或 /2.0)
我希望你能分享一些经验。
干杯
【问题讨论】:
-
先实施,后优化。也就是说,在你有工作代码之前不要担心性能。然后分析您的工作代码并优化瓶颈。
-
如今,对于复杂的优化编译器,回答这个问题的唯一真正方法是告诉您进行分析。如果可以的话,编译器通常“知道”将浮点除法转换为乘法,并且在现代 CPU 上使用分支预测等,很难以通用、有用的方式回答您的问题。
-
就像我说的,我不会开始从我的算法中挤出纳秒,但对于设计类和函数,一些基本规则会很有帮助。 :)
-
如果您想知道我为什么要问这个问题,我在这里有一个示例:我有一个执行基本双二阶计算的双二阶函数。我可能不想更改过滤器以使用 24db/octave 而不是 12db/octave 进行截止。因此,在双二阶函数中,我会创建一个条件,如果设置了 24db-bool,则样本会被另一个双二阶实例过滤。这个
if-statement 会产生影响还是与一般的双二阶计算(五次乘法,一些加法和赋值)相比“便宜” -
您也可以考虑使用现有的库或框架,而不是重新发明一切(除非目的只是为了学习)。比较可以找到here
标签: c++ performance signal-processing