相对跳跃与绝对跳跃的表现

问题描述 投票:0回答:1

不久前,我在编译器类中学习了闭包转换,并且想知道调用闭包与调用函数相比会产生多少性能开销。

考虑一个函数返回一个带有零个参数的闭包(因此没有变量捕获),唯一的区别是调用所述闭包将跳转到绝对地址,而不是调用被翻译为的函数的相对地址一个标签。

与相对跳转相比,绝对跳转是否有任何性能开销?例如,在 ARM64 处理器中,

bx Rm
b label
慢吗?

假设两种情况下跳转到的位置都已被缓存。

arm x86-64 cpu-architecture compiler-optimization
1个回答
0
投票

我们可以查看函数指针、lambda、闭包来了解闭包的一些定义。我们可以看到闭包允许访问调用者中的变量。在 pascal 中,您可以按引用或按值传递。 C++ 中的“&references”也是如此。这是针对单个值的。使用闭包,调用者的整个范围都是可访问的,但它是由实现定义的(需要哪些外部引用)。

我们可以以 C++ 中的“vtable”为例,它负责实现基类的继承覆盖。 “vtable”是从 this 指针引用的函数指针表。派生对象将具有一个 vtable,其条目与基类不同。

您提供的示例汇编程序是

bx Rm
b label
。这确实更像是C++虚方法的区别。虚拟方法通常使用
bx Rm
来调度,而不是直接调用。速度减慢是最小的,您可以找到各种对“C++ 虚拟函数开销”的引用。

想知道调用闭包与调用函数相比有多少性能开销?

如果闭包可以捆绑,只需要作为函数指针传递即可。所以对变量的访问就像

ldr Rn, [Rclosure, #variable]
。然后可以像按值传递一样使用“Rn”。通常,函数需要堆栈帧,特别是在寄存器压力很大的情况下。我想象生成汇编程序的语言会在调用者中组装函数“序言”,并且它将设置一个堆栈帧和/或一个允许访问调用者变量的变量“vtable”。就像“C++ 虚函数开销”一样,闭包引用应该处于相同的顺序(即非常非常小)。

© www.soinside.com 2019 - 2024. All rights reserved.