Abap 为什么赋值比附加行快?
我目前正在学习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(它不追加)。在某些情况下(例如传递参数时),数据甚至不会被复制。可以使用相同的数据,并且只
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
vsCallByRef
在许多编程语言中几乎都是一样的=
是一个赋值运算符和APPEND
追加(=复制)行。感受不同。