-1

我为 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]);
        }
    }
}
 }

更新2:

我的确切代码如下所示:

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

6 回答 6

3

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

但是,如果您确实使用“3D”指针(T***),则会出现大部分开销,因为它只会连续分配实际的匿名。指向指针的指针数组。这意味着每次间接都会使您付出沉重的代价,因为任何给定元素的地址都无法像使用线性布局在内存中的 T[m][n][q] 数组那样简单地计算(并且可以衰减为指针,也许这就是您所指的)。然后,由于内存和 CPU 性能之间的差异,您将产生开销。

于 2012-05-31T21:03:19.997 回答
2

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

于 2012-05-31T20:52:47.063 回答
2

过早的优化很糟糕!

您应该使用一个函数,并且仅在发现存在问题时才手动内联代码!(使用分析工具和性能测试)

函数开销可以忽略不计,尤其是考虑到您的代码。

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

于 2012-05-31T20:58:07.697 回答
1

假设您正在谈论的函数在循环内被调用:

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

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

于 2012-05-31T20:50:45.830 回答
1

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

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

于 2012-05-31T20:56:28.173 回答
1

它没有显着差异。该函数只被调用一次,在main. 所以函数调用开销,如果有的话,每次运行程序只支付一次。与运行程序所需的所有工作相比,一个额外的函数入口和返回算不了什么。

有一种方法可能很重要,即如果您未显示的参数之一...是按值传递的,并且复制起来确实很昂贵。但是,您显示的只是一个指针,因此复制起来并不昂贵。

于 2012-05-31T23:56:02.793 回答