【发布时间】:2016-12-02 01:33:49
【问题描述】:
我的代码中有一个大循环内的函数,它占用了大部分 cpu 时间:
inline void myfunc(double v1, ... , double vN){
...
(general, complex, multiline manipulation of v1 .. vN)
...
res = v1;
}
其中res是一个全局变量,传递参数的数量N约为20。我尝试通过传递变量指针来优化函数调用:
inline void myfunc(double *v1, ... , double *vN){
...
(general, complex, multiline manipulation of *v1 .. *vN)
...
res = *v1;
}
然后当然是通过myfunc(&v1, ..., &vN) 调用它。我假设在第一种情况下,函数必须在每次调用时创建本地 v1..vN 变量,而在第二种情况下则不需要。
我发现这两个版本都有效(呃!)但实际上我在第二种情况下根本没有加速。这是为什么呢?
【问题讨论】:
-
除了传递 20 个参数,你能传递一个指向包含参数的结构的指针吗?
-
通过获取地址,您更有可能阻止编译器进行优化。
-
你的参数都是
double吗? -
@cipper 如果编译器可以将您表达的意图优化为具有相同结果的更简单代码,则编译器没有义务实际传递任何参数。您表达的意图越简单,优化器的工作就越容易(假设您已启用它)。 Google 假设规则。
-
如果您的代码是 C,则不要包含 C++ 标签;如果您的代码是 C++,请不要包含 C 标记。这些语言有一些共同点,但现代 C++ 程序与现代 C 程序完全不同,反之亦然。
标签: c performance optimization parameter-passing