ZHO*_*HOU 5 c++ optimization performance inline
我分析了我的代码,发现一个内联函数占用了大约8%的样本.该函数用于将矩阵下标转换为索引.它非常像matlab函数sub2ind.
inline int sub2ind(const int sub_height, const int sub_width, const int width) {
return sub_height * width + sub_width;
}
Run Code Online (Sandbox Code Playgroud)
我猜编译器不执行内联扩展,但我不知道如何检查它.
有没有办法改善这个?或者明确让编译器执行内联扩展?
小智 5
你还记得用优化编译吗?有些编译器有一个强制内联的属性,即使编译器不想:看到这个问题.
但它可能已经存在; 您可以尝试让编译器输出汇编代码并尝试检查这种方式.
索引计算可能是您时间的重要部分并非难以置信 - 例如,如果您的算法是从矩阵读取,稍微计算,然后回写,那么索引计算确实是您计算时间的重要部分.
或者,您编写的代码是编译器无法证明width在整个循环中保持不变的方式*,因此每次都必须从内存中重新读取它,只是为了确定.尝试复制width到局部变量并在内部循环中使用它.
现在,您已经说过这需要8%的时间 - 这意味着您不可能获得比运行时间提高8%的任何东西,并且可能更少.如果这真的值得,那么要做的就是从根本上改变迭代数组的方式.
例如
width是编译时常量,你可以明确地这样做,例如作为模板参数,你的编译器可能能够用乘法做更聪明的事情*:您可能已经做了一些愚蠢的事情,比如将矩阵的数据结构放在存储矩阵条目的内存中!因此,当您更新矩阵时,您可能会更改宽度.编译器必须防范这些漏洞,因此它无法进行优化,它显然应该能够做到.有时,在一个环境中的漏洞很可能是程序员在另一个环境中的明显意图.一般来说,这些类型的循环漏洞往往遍布整个地方,编译器更容易发现这些漏洞,而不是人类注意到这些漏洞.
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |