关于 ABAP 函数调用 Pass by value 和 Pass by reference 的性能比较
ABAP(Advanced Business Application Programming)是一种高级业务应用编程语言,主要用于开发 SAP 系统。在 ABAP 中,函数调用时的参数传递方式有两种:按值传递(pass by value)和按引用传递(pass by reference)。这两种传递方式在很多编程语言中都有应用,它们在参数传递和内存管理方面有一些重要的区别。
- 按值传递(pass by value):
在按值传递中,函数调用时实际参数的值会被复制到形式参数中。这意味着函数内部对形式参数的修改不会影响到实际参数。由于参数的值是复制的,因此按值传递可能会增加内存消耗,特别是在处理大数据结构时。
在 ABAP 中,要使用按值传递,需要在参数声明中使用关键字 VALUE
。例如:
FORM my_function USING VALUE(param) TYPE i.
- 按引用传递(pass by reference):
在按引用传递中,函数调用时传递的是实际参数的内存地址,而不是参数的值。因此,函数内部对形式参数的修改会影响到实际参数。这种传递方式在内存消耗方面更为高效,因为它避免了复制参数值。
按引用传递是 ABAP 中默认的参数传递方式。要使用按引用传递,可以省略关键字 VALUE
:
FORM my_function USING param TYPE i.
总结一下,按值传递和按引用传递的主要区别如下:
- 按值传递在函数调用时会复制参数的值,而按引用传递只传递参数的内存地址。
- 按值传递不会改变实际参数的值,而按引用传递可能会改变实际参数的值。
- 按值传递可能会增加内存消耗,特别是在处理大数据结构时,而按引用传递在内存管理方面更为高效。
Subject: 2016-01-25 Task 优化进度 - document history全部完成
主方法的行数压缩到34行,把逻辑拆分成很多小方法,增加了可读性,但是一定程度上降低了性能:
- 因为ABAP 虚拟机实现里方法调用的入栈出栈是有开销的
- 几乎所有高级语言里,访问局部变量的速度快于访问类的成员变量
- 优化代码里方法的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毫秒的差异,可以放心使用了。
- 点赞
- 收藏
- 关注作者
评论(0)