为什么赋值比 APPEND LINES OF 快?
Why assignment is faster than APPEND LINES OF?
我目前正在学习 ABAP,谁能解释为什么 t_table2 = t_table1
比 APPEND LINES OF t_table1 TO t_table2
快得多?
t_table1、t_table2 是内部表
我不能说这是一个完整的原因(可能还有更多我不知道的幕后操作),但其中一些原因肯定包括以下几点。
这里要注意一点:在中小型数据集上,速度差异可以忽略不计。
t_table2 = t_table1
只是获取所有数据并复制它,覆盖 t_table2
(它不是 append
)。在某些情况下(例如传递参数时),数据甚至不会被复制。可以使用相同的数据,只有在 t_table2 需要更改时才会生成副本。
APPEND LINES OF t_table1 TO t_table2
基本上是一个循环,逐行追加记录。
我提到 append
的原因是因为覆盖 table 可以像从 a
到 [=16] 复制数据(或在极少数情况下的数据引用)一样简单=],而 append 执行检查 table 是否已排序、索引等。即使 table 处于最基本的状态,附加内部 table 的过程也比覆盖变量稍微复杂一些。
除了 Zero 和 Cameron Smith 的回答之外,还有一个名为“table sharing" (AKA "copy-on-write”的概念,它会延迟复制,直到任何源或目标内部 table 发生更改。
如果我简化很多,可以将其表示为 8 个字节的副本(源内部地址 table)的赋值。反正大多数时候,内部的2个table中的一个都会改(不然代码里怎么会有copy!)所以最后的表现往往差不多,只是有时候会有一个好处,因为写了一些代码 "badly"。
内存分配
当你用DATA定义一个内部table时,内核会在内存中分配不止一行的space,所以它们被存储在一起。此外,每次您填写这些行时,都会再次预订更大的批次。
您可以在内存转储中看到这一点,在这种情况下,将分配 16 行:
当你用APPEND LINES OF
复制时,内核会逐行复制。
当你说 itab1 = itab2
时,它会被复制成块。
快多少
根据以上信息,您可能认为逐行慢了 16 倍。实际上,根据行宽、行数、内核版本和许多其他因素,它不会慢 10-30%。
我目前正在学习 ABAP,谁能解释为什么 t_table2 = t_table1
比 APPEND LINES OF t_table1 TO t_table2
快得多?
t_table1、t_table2 是内部表
我不能说这是一个完整的原因(可能还有更多我不知道的幕后操作),但其中一些原因肯定包括以下几点。 这里要注意一点:在中小型数据集上,速度差异可以忽略不计。
t_table2 = t_table1
只是获取所有数据并复制它,覆盖 t_table2
(它不是 append
)。在某些情况下(例如传递参数时),数据甚至不会被复制。可以使用相同的数据,只有在 t_table2 需要更改时才会生成副本。
APPEND LINES OF t_table1 TO t_table2
基本上是一个循环,逐行追加记录。
我提到 append
的原因是因为覆盖 table 可以像从 a
到 [=16] 复制数据(或在极少数情况下的数据引用)一样简单=],而 append 执行检查 table 是否已排序、索引等。即使 table 处于最基本的状态,附加内部 table 的过程也比覆盖变量稍微复杂一些。
除了 Zero 和 Cameron Smith 的回答之外,还有一个名为“table sharing" (AKA "copy-on-write”的概念,它会延迟复制,直到任何源或目标内部 table 发生更改。
如果我简化很多,可以将其表示为 8 个字节的副本(源内部地址 table)的赋值。反正大多数时候,内部的2个table中的一个都会改(不然代码里怎么会有copy!)所以最后的表现往往差不多,只是有时候会有一个好处,因为写了一些代码 "badly"。
内存分配
当你用DATA定义一个内部table时,内核会在内存中分配不止一行的space,所以它们被存储在一起。此外,每次您填写这些行时,都会再次预订更大的批次。
您可以在内存转储中看到这一点,在这种情况下,将分配 16 行:
当你用APPEND LINES OF
复制时,内核会逐行复制。
当你说 itab1 = itab2
时,它会被复制成块。
快多少
根据以上信息,您可能认为逐行慢了 16 倍。实际上,根据行宽、行数、内核版本和许多其他因素,它不会慢 10-30%。