如果我要重复引用它们,我应该将C数组值存储在局部变量中吗?
我正在编写一些优化的C代码,它基本上通过一个数组运行,并为每个元素做一些事情.它的作用取决于元素的当前值,如下所示:
for (i=0; i < a_len; i++) { if (a[i] == 0) { a[i] = f1(a[i]); } else if (a[i] % 2 == 0) { a[i] = f2(a[i]); } else { a[i] = 0; } 我在动态语言工作多年后回到C,我的做法是尝试编写简单的代码而不是为我可以直接引用的东西创建大量局部变量,如上面的[i].我非常清楚最佳实践是编写可读代码并相信编译器比您更聪明,并且会做出很好的优化. 如果我在汇编程序中编写上面的代码,我会将[i]加载到寄存器中一次,然后每次只使用该值,因为我知道[]是私有内存,并且不会在引用之间进行更改.但是,即使是智能编译器也可能每次都加载,因为它无法确定内存是否已更改. (或者我必须为编译器显式声明“a”volatile以不进行此优化吗?). 所以,我的问题是:我是否应该通过使用像这样的局部变量重写来获得更好的性能: for (i=0; i < a_len; i++) { val = a[i]; if (val == 0) { a[i] = f1(val); } else if (val % 2 == 0) { a[i] = f2(val); } else { a[i] = 0; } 或者像-O3这样的东西会自动为我处理吗?我正在优化的代码需要数天才能运行,因此即使是适度的改进也会产生影响. 解决方法
函数f1和f2似乎共享相同的签名.他们的表现有多么不同?你真的需要外面的支票吗?或者,您可以将逻辑嵌入到一个函数中吗?
如果你有一个if-else梯形而不是只有两个这样的函数,请尝试使用函数指针数组.使用a [i]的值索引到该数组并调用正确的函数. 手优化通常证明是容易出错的微优化.最好将此任务留给编译器.如果您真的需要优化,请查看大图,考虑算法,设计,图层等. 至于你的问题:是的,如果a [i]没有被声明为volatile,大多数编译器都可能会优化内存读取. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |