Abap 为什么赋值比附加行快?

Abap 为什么赋值比附加行快?,abap,internal-tables,Abap,Internal Tables,我目前正在学习ABAP,有人能解释为什么t_table2=t_table1比将t_table1的行追加到t_table2要快得多吗 t_table 1、t_table 2是内部表我不能说这是一个完整的原因(可能幕后还有更多我不知道的事情),但一些原因肯定包括以下几点。 这里需要注意的是:在中小型数据集上,速度的差异可以忽略不计 t_table2=t_table1仅获取所有数据并复制它,覆盖t_table2(它不追加)。在某些情况下(例如传递参数时),数据甚至不会被复制。可以使用相同的数据,并且只

我目前正在学习ABAP,有人能解释为什么
t_table2=t_table1
将t_table1的行追加到t_table2
要快得多吗


t_table 1、t_table 2是内部表

我不能说这是一个完整的原因(可能幕后还有更多我不知道的事情),但一些原因肯定包括以下几点。 这里需要注意的是:在中小型数据集上,速度的差异可以忽略不计

t_table2=t_table1
仅获取所有数据并复制它,覆盖
t_table2
(它不
追加
)。在某些情况下(例如传递参数时),数据甚至不会被复制。可以使用相同的数据,并且只有在需要更改t_表2时才会生成副本

将t_表1的行追加到t_表2
基本上是一个循环,它逐行追加记录


我之所以提到
append
,是因为表的覆盖可以简单地从
a
b
,而append则检查表是否排序、索引等。即使表处于最基本的状态,内部表的追加过程也比变量的覆盖过程稍微复杂一些。

除了Zero和Cameron Smith给出的答案之外,还有一个称为“(AKA”)的概念,它会延迟复制,直到源或目标内部表中的任何一个发生更改

如果我简化很多,可以将其表示为8字节的副本(源内部表的地址)的赋值。无论如何,大多数情况下,两个内部表中的一个会被更改(否则,为什么代码中会有一个副本!),因此最终的性能通常几乎是相同的,只是因为某些代码“写得不好”,有时会有好处。

内存分配 当您使用数据定义一个内部表时,内核会在内存中分配多个行的空间,因此它们存储在一起。此外,每次您填写这些行时,将再次预订更大的一批。
您可以在内存转储中看到这一点,在这种情况下,将分配16行:

当您使用的附加行进行复制时,内核会逐行复制

当你只说
itab1=itab2
时,它会被分块复制

多快
根据以上信息,您可能会认为逐行计算的速度要慢16倍。实际上,这并不取决于行宽、行数、内核版本和许多其他因素,它只是慢了10-30%

Google
CallByValue
vs
CallByRef
在许多编程语言中几乎都是一样的
=
是一个赋值运算符和
APPEND
追加(=复制)行。感受不同。