Почему назначение быстрее, чем APPEND LINES OF? - PullRequest
0 голосов
/ 05 июля 2018

Я сейчас изучаю ABAP, и кто-нибудь может объяснить, почему t_table2 = t_table1 значительно быстрее, чем APPEND LINES OF t_table1 TO t_table2?

t_table1, t_table2 - внутренние таблицы

Ответы [ 4 ]

0 голосов
/ 21 июля 2018

Распределение памяти

Когда вы определяете внутреннюю таблицу с помощью DATA, ядро ​​выделяет в памяти более одной строки, поэтому они сохраняются вместе. Также каждый раз, когда вы заполняете эти строки, снова будет заказываться большая партия.
Вы можете увидеть это в дампах памяти, в этом случае было бы выделено 16 строк: Newly requested rows: 16

Когда вы копируете с APPEND LINES OF, ядро ​​копирует построчно.

Когда вы просто говорите itab1 = itab2, оно копируется блоками.

Насколько быстрее

Исходя из приведенной выше информации, вы можете подумать, что построчно в 16 раз медленнее. На практике это не зависит от ширины строки, количества строк, версии ядра и многих других вещей, это всего лишь на 10-30% медленнее.

0 голосов
/ 05 июля 2018

Поскольку строки добавления работают как цикл и выполняют построчные операции.

t_table2 = t_table1 - мелкая копия.

Мелкое копирование аналогично глубокому копированию (добавление строк) при назначении каждого члена объекта тому или иному объекту, но отличается тем, как копируется поле ссылочного типа. В отличие от мелкой копии, где ссылка только копируется, в глубокой копии создается новая копия упомянутого объекта.

0 голосов
/ 05 июля 2018

В дополнение к ответам Зеро и Кэмерона Смита также существует концепция под названием " совместное использование таблицы " (AKA " копирование при записи "), которая задерживает копирование до любая исходная или целевая внутренняя таблица изменена.

Если бы я много упростил, его можно было бы представить как присвоение, как копию 8 байт (адрес внутренней таблицы источника). В любом случае, в большинстве случаев одна из 2 внутренних таблиц будет изменена (в противном случае, почему в коде должна быть копия!), Поэтому конечная производительность часто почти одинакова, просто иногда есть преимущество из-за некоторых код "плохо" написан.

0 голосов
/ 05 июля 2018

Я не могу сказать, что это полная причина (вероятно, за кулисами происходит больше, чего я не знаю), но некоторые из причин определенно включают следующее. На что следует обратить внимание: для небольших и средних наборов данных разница в скорости незначительна.

t_table2 = t_table1 просто берет все данные и копирует их, перезаписывая t_table2 (это НЕ append). В некоторых случаях (например, при передаче параметров) данные даже не копируются. Могут использоваться те же данные, и копия будет создаваться только в случае необходимости изменения t_table2.

APPEND LINES OF t_table1 TO t_table2 - это в основном цикл, который добавляет записи строка за строкой.

Причина, по которой я упоминаю append, заключается в том, что перезапись таблицы может быть такой же простой, как копирование данных (или ссылка на данные в редких случаях) от a до b, в то время как append выполняет проверку, действительно ли таблица сортируется, индексируется и тому подобное. Даже если таблица находится в самом базовом состоянии, добавление внутренней таблицы является несколько более сложной процедурой, чем перезапись переменной.

...