【问题标题】:Does a returning function has more performance overhead than the non-returning function?返回函数是否​​比非返回函数具有更多的性能开销?
【发布时间】:2020-02-10 19:45:13
【问题描述】:

我处于从函数返回值是可选的情况。所以无论我返回还是不返回在逻辑上都没有区别,但我可以安全地假设同样的事情吗?

我的意思是当我们使用返回一些值的函数(例如:Int)而不是返回 void 的函数时,是否存在任何性能开销(时间或内存)

这是一个虚拟项目,出于好奇而提出这个问题。

【问题讨论】:

  • 可能会有细微差别(虽然我不确定)但它可能可以忽略不计,并且为此烦恼可能不值得 - 除非你在您真的需要这种级别的微优化的情况,但在这种情况下,无论如何您都必须更深入地研究字节码、硬件等。
  • “我返回或不返回在逻辑上没有区别”......你的设计很奇怪
  • 永远不要问这样的问题。不同系统上的结果可能不同。如果您想知道:测量它(可能与目标系统的相同环境)。如果您无法衡量差异,则意味着这无关紧要。另见softwareengineering.stackexchange.com/questions/80084/…
  • 如果您检查每种情况下生成的汇编程序(C)/字节(Java)代码,它可能会告诉您您想知道的内容。
  • 我们不能笼统地回答这个问题,你需要有一个特定的系统。答案取决于 ABI 的调用约定,以及编译器是否可以内联函数调用。虽然一般来说:额外的功能需要额外的性能。

标签: c performance processing-efficiency memory-efficient


【解决方案1】:

这取决于使用的 ABI 以及被调用的函数是否内联。

在带有System V Application Binary Interface AMD64(Linux、FreeBSD、macOS、Solaris 和 Windows Linux 子系统)的 x86_64 平台上,在寄存器中返回带有最多 16 个字节的 sizeof 的返回值。返回最多 16 个字节涉及将返回值加载到一个或两个 8 字节寄存器中。返回较大的值涉及通过传递给被调用者的隐藏返回值指针存储到调用者的堆栈中,该指针也必须在返回时加载到rax寄存器中。

请参阅Calling conventions by Agner Fog 了解调用约定的详细处理,特别是§7.1 传递和返回对象。在寄存器中传递 SIMD 类型有单独的调用约定。

【讨论】:

    猜你喜欢
    • 2021-04-11
    • 1970-01-01
    • 2014-06-23
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    相关资源
    最近更新 更多