如何提高内联功能效率?

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是编译时常量,你可以明确地这样做,例如作为模板参数,你的编译器可能能够用乘法做更聪明的事情

*:您可能已经做了一些愚蠢的事情,比如将矩阵的数据结构放在存储矩阵条目的内存中!因此,当您更新矩阵时,您可能会更改宽度.编译器必须防范这些漏洞,因此它无法进行优化,它显然应该能够做到.有时,在一个环境中的漏洞很可能是程序员在另一个环境中的明显意图.一般来说,这些类型的循环漏洞往往遍布整个地方,编译器更容易发现这些漏洞,而不是人类注意到这些漏洞.