Почему присваивание выполняется быстрее, чем APPEND LINES OF?

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

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


person Mykola    schedule 05.07.2018    source источник
comment
Google CallByValue и CallByRef почти одинаковы во многих языках программирования   -  person Felix D.    schedule 05.07.2018
comment
= — это оператор присваивания, а APPEND добавляет (= копирует) строки. Почувствуйте разницу.   -  person Suncatcher    schedule 05.07.2018


Ответы (3)


Выделение памяти

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

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

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

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

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

person András    schedule 21.07.2018

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

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

person Sandra Rossi    schedule 05.07.2018

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

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

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

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

person Zero    schedule 05.07.2018