繁体   English   中英

具有和不具有参数C / C ++的函数之间的执行时间

[英]Execution time between functions with & without arguments C/C++

我只想问以下情况下执行时间有何不同?

a)我们在main()声明了变量,并使用参数在函数中将其发送

b)我们有全局变量,可以直接从不带参数的函数中访问它们

关键是我开始编写一些Aps,并且看到了一些有关此的讨论,但是我还没有编写任何使两者之间的差异大几毫秒的应用程序。

将参数传递给函数通常涉及以下两个汇编程序指令之一: push param (和后来的pop param )或mov ax, param 由于处理器能够在一秒钟内完成更多(很多)操作,因此这种“优化”很可能不会被注意到(整个程序的几毫秒低于错误余量)

使用全局变量代替函数参数会导致代码混乱,几乎不会引起注意,甚至可能不会提高性能。

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

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

  • 该参数存储在CPU寄存器中。 这非常有效。
  • 该参数存储在堆栈中。 这是最常见的。 函数启动/完成时,将参数压入/从堆栈中弹出/弹出堆栈会涉及一些较小的开销。
  • 该参数根本不是新变量。 而是,编译器内联函数并使用原始变量进行修改。 这大约是您可以获得的最高效率。

使用全局变量将比使用堆栈快得多。 它绝对比使用CPU寄存器快:在函数内部,无论如何计算,可能需要将该值加载到此类寄存器中。

应该注意的是,我们在这里和那里谈论的是几个CPU滴答声。

我的建议:

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

堆栈操作非常高效,由于堆栈可能位于高速缓存中,因此它们的工作效率更高。 这可能会使使用堆栈比不使用堆栈更快。

期望参数传递的变量比全局变量快很多。 在现代ABI中,大多数使用CPU寄存器传递功能参数,而CPU寄存器可立即使用。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM