关于 ABAP 函数调用 Pass by value 和 Pass by reference 的性能比较

发布时间 2023-07-01 15:01:15作者: JerryWang_汪子熙

ABAP(Advanced Business Application Programming)是一种高级业务应用编程语言,主要用于开发 SAP 系统。在 ABAP 中,函数调用时的参数传递方式有两种:按值传递(pass by value)和按引用传递(pass by reference)。这两种传递方式在很多编程语言中都有应用,它们在参数传递和内存管理方面有一些重要的区别。

  1. 按值传递(pass by value):
    在按值传递中,函数调用时实际参数的值会被复制到形式参数中。这意味着函数内部对形式参数的修改不会影响到实际参数。由于参数的值是复制的,因此按值传递可能会增加内存消耗,特别是在处理大数据结构时。

在 ABAP 中,要使用按值传递,需要在参数声明中使用关键字 VALUE。例如:

FORM my_function USING VALUE(param) TYPE i.
  1. 按引用传递(pass by reference):
    在按引用传递中,函数调用时传递的是实际参数的内存地址,而不是参数的值。因此,函数内部对形式参数的修改会影响到实际参数。这种传递方式在内存消耗方面更为高效,因为它避免了复制参数值。

按引用传递是 ABAP 中默认的参数传递方式。要使用按引用传递,可以省略关键字 VALUE

FORM my_function USING param TYPE i.

总结一下,按值传递和按引用传递的主要区别如下:

  • 按值传递在函数调用时会复制参数的值,而按引用传递只传递参数的内存地址。
  • 按值传递不会改变实际参数的值,而按引用传递可能会改变实际参数的值。
  • 按值传递可能会增加内存消耗,特别是在处理大数据结构时,而按引用传递在内存管理方面更为高效。

Subject: 2016-01-25 Task 优化进度 - document history全部完成

主方法的行数压缩到34行,把逻辑拆分成很多小方法,增加了可读性,但是一定程度上降低了性能:

  1. 因为ABAP 虚拟机实现里方法调用的入栈出栈是有开销的
  2. 几乎所有高级语言里,访问局部变量的速度快于访问类的成员变量
  3. 优化代码里方法的signature使用了很多return type,returning只能通过pass by value传递,比pass by ref慢。但是具体慢多少没测过。没有经过性能测试,贸然把所有returning 参数改成exporting也不明智。

目前AG3用我的账号测试结果。左边是请求已经优化过的前4个节点,右边column是4个优化节点+attachment。单位为秒。

可以看出attachment确实比较慢,极端情况下耗费的时间几乎等于前四个节点的时间总和。

明天开始attachment的优化研究。

Subject: RE: one action item for 2016-01-25 - performance between pass by value and pass by reference

这是周一一个action item的followup

我现在代码里大量使用了pass by value的returning写法,因为这样代码写出来比pass by ref稍稍精简点,可以少敲几个字符。但是pass by value会在函数体内return的时候,存在形参copy到实参的拷贝。因为拿不定注意最后到底用哪种,做了一个简单的测试。

分别用两种方式在method里填充一个拥有10个字段的structure,然后用两种方式返回:

比较绿色的pass by ref和蓝色的pass by value性能。

1000条:

性能相差0.4毫秒

100万条:

性能相差0.2秒

由于offline的use case显然是1000条的case,只有0.4毫秒的差异,可以放心使用了。