函数与和之间的执行时间;没有参数/ C ++

时间:2014-05-16 05:54:20

标签: c++ c function execution-time

我想问一下执行时间的差异:

a)我们在main()中声明了变量,并使用参数

将它们发送到函数中

b)我们有全局变量并直接从没有参数的函数访问它们

问题是我开始写几篇文章并且刚刚看了几个关于此的讨论,但我还没有编写任何使差异大于几毫秒的应用程序。

4 个答案:

答案 0 :(得分:4)

将参数传递给函数涉及通常两个汇编指令之一:push param(以及后来的pop param)或mov ax, param。由于处理器能够在一秒钟内完成(很多),所以这种“优化”很可能会被忽视(整个程序的几毫秒低于误差范围)

在函数参数的位置使用全局变量将导致代码中的大量混乱,几乎无法察觉或可能没有性能提升。

答案 1 :(得分:4)

所有这些都取决于所使用的CPU和编译器。

将参数传递给函数时,可能会发生以下情况之一:

  • 该参数存储在CPU寄存器中。这非常有效。
  • 参数存储在堆栈中。这是最常见的。它涉及在启动/完成功能时向/从堆栈推送/弹出参数的一些小开销。
  • 参数根本不是新变量。相反,编译器会内联函数并使用原始变量进行修改。这和你能得到的效率差不多。

使用全局变量将比使用堆栈快一点。它会比使用CPU寄存器更快:在函数内部,无论如何,在计算之前可能需要将值加载到这样的寄存器中。

应该注意的是,我们在这里和那里讨论一些CPU滴答声。

我的建议:

  • 除非您对所使用的特定CPU有深入的硬件知识,否则不应尝试任何类型的手动优化。如果您没有这方面的知识,编译器将比99%的情况更好地优化代码。因为编译器端口很可能是由给定系统的专家编写的。编译器也知道程序员没有的整体性能图,因此编译器更适合进行优化。
  • 除非您实际执行了正式的基准测试并在程序中找到了瓶颈,否则不应尝试任何类型的手动优化。
  • 全局变量非常糟糕且使用起来很危险。它们导致意大利面条代码,而且它们不是线程安全的。
  • 如果您正在编写某种高端桌面应用程序,例如PC程序或手机应用程序,那么使用全局变量来提高性能完全无意义。您正处于一个开始时不存在实时性能的系统上!在任何给定的时间,您的操作系统可能会决定咀嚼数十亿的CPU滴答,同时为您的程序提供指导。所以不要追逐1或2个CPU滴答声。
  • 如果您正在开发非常接近硬件的嵌入式系统应用程序,并且同时具有硬实时要求,那么这种手动优化才有意义。

答案 2 :(得分:2)

堆栈操作非常有效,并且它们的效率更高,因为堆栈很可能位于高速缓冲存储器中。这可能比使用堆栈更快地使用堆栈。

答案 3 :(得分:2)

期望参数传递变量比全局变量快很多。在现代ABI中,函数参数主要通过CPU寄存器传递,CPU寄存器可立即供CPU使用。

必须从(静态)内存中读取全局变量。更糟糕的是,静态内存分配在自己的内存页面上,这通常远离堆栈(或堆)内存。这意味着缓存未命中的可能性更大,这反过来意味着访问可能会消耗大量的CPU周期。

显然,这很大程度上取决于您的使用模式。