为什么分配的速度比“追加行数”快?

时间:2018-07-05 06:53:45

标签: sap abap

我目前正在学习ABAP,谁能解释为什么t_table2 = t_table1APPEND LINES OF t_table1 TO t_table2快得多?

t_table1,t_table2是内部表

4 个答案:

答案 0 :(得分:2)

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

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

APPEND LINES OF t_table1 TO t_table2基本上是一个循环,它逐行追加记录。

我之所以提到append的原因是,表的覆盖可以像从ab的复制数据(在极少数情况下为数据引用)一样简单,而append执行检查表是否已排序,索引等。即使表处于最基本的状态,内部表的追加过程也比覆盖变量要复杂一些。

答案 1 :(得分:2)

除了Zero和Cameron Smith的答案之外,还有一个概念称为“ table sharing”(又名“ copy-on-write”),该概念将复制延迟到源表或目标内部表中的任何一个改变了。

如果我简化很多,可以像分配8字节(源内部表的地址)那样分配它。无论如何,大多数时候,两个内部表之一都会被更改(否则,为什么在代码中会有一个副本!),所以最终的性能通常几乎是相同的,只是有时候由于某些原因会有好处。代码“严重”。

答案 2 :(得分:0)

因为追加行的工作方式类似于循环,并且逐行执行操作。

t_table2 = t_table1是浅表副本。

在将对象的每个成员分配给另一个对象的过程中,浅拷贝与深拷贝(附加行)相似,但是在引用类型字段的复制方式上有所不同。与仅复制引用的浅表复制不同,在深表复制中,将创建所引用对象的新副本。

答案 3 :(得分:0)

内存分配

当您使用DATA定义内部表时,内核会在内存中分配多于一行的空间,因此它们将一起存储。同样,每次填充这些行时,都会再次预订更大的批次。
您可以在内存转储中看到这一点,在这种情况下,将分配16行: Newly requested rows: 16

使用APPEND LINES OF复制时,内核会逐行复制。

您只说itab1 = itab2时,它会成块复制。

快多少

根据上述信息,您可能会认为逐行速度慢了16倍。实际上,根据行宽,行数,内核版本以及许多其他因素,它的速度不会慢10-30%。