哪一个性能更好:使用函数还是确切的代码?

时间:2012-05-31 20:48:35

标签: c++ performance performance-testing

我为3D模拟编写代码,所以我的代码充满了这样的东西:

可能使用功能导致开销?为什么?

“a”是一个3D指针。

更新

功能定义

double update_a(double a[][JE][KE],...)
{

for(i=1;i<IE;i++){
    for(j=1;j<JE;j++){
        for(k=1;k<KE;k++){
            curl_h=(hz[i][j][k]-hz[i][j-1][k]-hy[i][j][k]+hy[i][j][k-1]);
            idxl[i][j][k]=idxl[i][j][k]+curl_h;
            a[i][j][k]=gj3[j]*gk3[k]*dx[i][j][k]+gj2[j]*gk2[k]*.5*(curl_h+gi1[i]*idxl[i][j][k]);
        }}}

IE = JE = KE = 200

哪一个更好:

 int main()
{
 update_a(...)}

int main(){
 for (i=0; i<200; i++) {
    for (j=0; j<200; j++) {
        for (k=0; k<200; k++) {
             curl_h=(hx[i][j][k]-hx[i][j][k-1]-hz[i][j][k]+hz[i-1][j][k]);

                idyl[i][j][k]=idyl[i][j][k]+curl_h;
                a[i][j][k]=gi3[i]*gk3[k]*ey[i][j][k]+gi2[i]*gk2[k]*0.5*(curl_h+gj1[j]*idyl[i][j][k]);
        }
    }
}
 }

UPDATE2:

我的确切代码如下:

int main()
    {
for(n=1;n<100000;n++){
     update_a(...);
update_a2(...);
.
.
.
update_a30(...);}}

6 个答案:

答案 0 :(得分:3)

将代码存储在函数中可能会导致一些开销,如果每秒调用一千次,就会开始构建,但请注意有很多适合各种编译器优化的地方将很可能执行,因为它位于一个循环中(这是通常的更新逻辑功能所在的3D模拟,因为它是perframe数据)。我建议不要对此做任何事情,只有在测试过程中发现问题然后才可能进入“手动优化模式”。

但是,如果您确实使用“3D”指针(T ***),则会产生大部分开销,因为它只会连续分配实际的anon。指针数组。这意味着每个间接都会花费你很多,因为任何给定元素的地址都不能像在T [m] [n] [q]数组中那样平凡地计算,该数组在内存中线性排列(并且可以衰变为指针,也许这就是你所指的)。然后,由于内存和CPU性能之间的差异,您将产生开销。

答案 1 :(得分:2)

与您提供的代码的运行时间相比,函数调用的性能损失是微不足道的。

答案 2 :(得分:2)

过早的优化很糟糕!

你应该使用一个函数,只有在找到并发出代码时才能内联代码! (使用分析工具和性能测试)

考虑到代码,函数开销可以忽略不计,特别是如此。

无论如何,许多编译器都会根据需要内联函数。这意味着你所做的任何内容都不会影响性能,并且会导致维护和代码可读性问题。

答案 3 :(得分:1)

假设您正在谈论的功能在循环中被调用:

在任何现代C ++编译器上,该函数几乎肯定会被内联。以g ++为例,你会发现使用函数调用生成的机器代码与没有函数调用时生成的机器代码相同。

如果函数调用在循环之外,编译器是否决定内联函数取决于使用函数的上下文。

答案 4 :(得分:1)

函数调用会稍微影响你创建堆栈和其他东西的性能。

但是在你的情况下它并不重要,因为你只有几行代码(假设)。

答案 5 :(得分:1)

没有显着差异。该函数仅在main中调用一次。因此,函数调用开销(如果有的话)仅在每次运行程序时支付一次。与运行程序所需的所有工作相比,一个额外的函数输入和返回都没有。

有一种方法可能是非平凡的,即如果...中未显示的参数之一是按值传递的,并且复制起来非常昂贵。你所展示的那个只是一个指针,但复制起来并不昂贵。