函数参数和局部变量如何影响C程序的性能

时间:2019-09-04 17:46:08

标签: c performance

是否值得减少函数参数和局部变量的数量以增强C程序的性能?

在下面提供的代码中,如果在执行过程中多次调用该函数,则该示例可能不会有所不同,但是如果该调用被称为 n次,则可能有意义,因此有没有在这种情况下可以提高性能?

int n[4];
// read numbers ...

do_sum1(n[0], n[1], n[2], n[4]);
do_sum2(n);

// Functions definition
// --------------------
void do_sum1(int a, int b, int c, int d)
{
  printf("%d\n", a + b + c + d);
}

void do_sum2(int n[4])
{
  printf("%d\n", n[0] + n[1] + n[2] + n[3]);
}

2 个答案:

答案 0 :(得分:5)

这个问题比看起来复杂。

首先,让我们假设函数没有内联(否则它们很可能被编译为相同的代码),然后分析效果。

一方面,要起作用的参数数量会影响性能。 在所有其他条件相同的情况下,传递的参数越多,性能越差-因为将参数复制到place函数会期望找到它们(无论是堆栈,寄存器还是任何其他存储)都不会-0时间。

另一方面,语义很重要,在这种特殊情况下,情况并不相等!在第一种情况下,您要传递4个整数参数。假设使用AMD64 ABI,它们将通过CPU寄存器传递-读取和写入都非常快地访问它们。

但是,在第二种情况下,您实际上是将指针传递到内存位置。这意味着,通过该指针访问值意味着间接的,最好是在L1 CPU高速缓存中找到这些值(最有可能),但最糟糕的是将从主内存中读取(超级慢!)。虽然L1高速缓存非常快,但与寄存器访问相比仍然慢得多。

底线:

我希望第二种情况比第一种情况慢。

答案 1 :(得分:2)

  

是否值得减少函数参数和局部变量的数量以增强C程序的性能?

第一个要问的问题是,增强程序性能吗?它将根本产生可测量的变化吗?不要盲目地假设会这样。

要问的第二个问题是,这样做的权衡是什么?它将如何影响您调试和维护代码的能力?是的,您可以使所有内容全局化,以消除传递的参数和使用局部变量,但这样做的结果是使代码很多难以理解和维护。

在考虑提高性能时,您应该从最高级别开始,然后逐步降低:

  1. 您是否正在使用正确的数据结构和/或算法来解决当前的问题?例如,未经优化的快速排序仍会比主动调整的气泡排序(一般情况下)更胜一筹,二进制搜索通常比线性搜索快,等等。

  2. 您是在使用适当的工具还是库,还是您亲自动手改造了一切?可能已经有经过测试和调整的解决方案,您不必从头开始。

  3. 您设计得很好吗?例如,您的循环体内是否有任何不变量?

如果所有这些问题的答案均​​为“是”,则下一步是让编译器进行一些优化(例如,将-O2标志与gcc一起使用)。 C编译器已经非常擅长优化代码,并且根据程序,您可以看到一些显着的加速。

如果这时您仍然觉得代码太慢,则需要进行一些分析。通过探查器运行代码以查找瓶颈所在。 此时,您可以开始研究微观优化,例如减少传递给函数的参数数量。只是要知道,这样做可能不足以值得我们付出努力。