c++ - 如何提高内联函数效率?

标签 c++ performance optimization inline

我分析了我的代码,发现一个内联函数占用了大约 8% 的样本。作用是将矩阵下标转换为索引。它很像 matlab 函数 sub2ind

inline int sub2ind(const int sub_height, const int sub_width, const int width) {
    return sub_height * width + sub_width;
}

我猜编译器没有执行内联扩展,但我不知道如何检查。

有什么办法可以改善吗?还是明确让编译器进行内联展开?

最佳答案

你还记得优化编译吗?一些编译器具有强制内联的属性,即使编译器不想这样做:参见 this question .

但它可能已经存在;您可以尝试让您的编译器输出汇编代码并尝试以这种方式进行检查。

索引计算可能会占用您的大部分时间,这并非难以置信——例如如果您的算法是从矩阵读取,进行一些计算,然后写回,那么索引计算确实会占用您计算时间的很大一部分。

或者,您编写代码的方式编译器无法证明 width 在整个循环中保持不变*,因此每次都必须从内存中重新读取它,只是为了确定。尝试将 width 复制到局部变量并在您的内部循环中使用它。

现在,您已经说过这会占用您 8% 的时间 — 这意味着您可能的运行时间改进不可能超过 8%,而且可能会多很多较少的。如果这真的值得,那么要做的事情可能就是从根本上改变你遍历数组的方式。

例如

  • 如果您倾向于以线性方式访问矩阵,您可以编写某种二维迭代器类,您可以向上、向下、向左或向右前进,并且它将在任何地方使用加法而不是乘法<
  • 同样的事情,但是写了一个“索引”类来保存数字而不是假装是一个指针
  • 如果 width 是一个编译时常量,您可以明确地指定它,例如作为模板参数,你的编译器可能会用乘法做更聪明的事情

*:您可能做了一些愚蠢的事情,比如将矩阵的数据结构放在存储矩阵条目的内存中!所以当你更新矩阵时,你可能会改变宽度。编译器必须防范这些漏洞,因此它无法进行“显然应该”能够进行的优化。有时,一种情况下的漏洞很可能是程序员在另一种情况下的明显意图。一般来说,这类循环漏洞往往随处可见,编译器更善于发现这些漏洞,而不是人类注意到它们。

关于c++ - 如何提高内联函数效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30022063/

相关文章:

PHP 和 MYSQL 优化的按日期间隔选择的方式

c++ - 从 C++ 在 QML 中设置对象类型属性

c++ - 如何在关联指针时编写无错误代码?

随着多行文本框中字符串的增长,C# 应用程序变得缓慢且无响应

c - 设计代码以适应 CPU 缓存?

android - SoftReferences 中 Drawable 的延迟加载失败

c++ - 使用 ifstream 时出现语法错误

C++:为表实现行迭代器

matlab - 找到向量 b 的唯一索引的最快方法,其中数组 A(i,j) == b

mysql - 优化 JOIN 子查询中的 WHERE 子查询