В настоящее время я изучаю ABAP, и кто-нибудь может объяснить, почему t_table2 = t_table1
значительно быстрее, чем APPEND LINES OF t_table1 TO t_table2
?
t_table1, t_table2 — внутренние таблицы
В настоящее время я изучаю ABAP, и кто-нибудь может объяснить, почему t_table2 = t_table1
значительно быстрее, чем APPEND LINES OF t_table1 TO t_table2
?
t_table1, t_table2 — внутренние таблицы
Когда вы определяете внутреннюю таблицу с помощью DATA, ядро выделяет более одной строки в памяти, поэтому они хранятся вместе. Также каждый раз, когда вы заполняете эти строки, снова будет резервироваться большая партия.
Вы можете увидеть это в дампах памяти, в этом случае было бы выделено 16 строк:
Когда вы копируете с помощью APPEND LINES OF
, ядро копирует построчно.
Когда вы просто произносите itab1 = itab2
, оно копируется блоками.
Основываясь на приведенной выше информации, вы можете подумать, что построчное выполнение в 16 раз медленнее. На практике это не так, в зависимости от ширины строки, количества строк, версии ядра и многого другого медленнее всего на 10-30%.
В дополнение к ответам Зеро и Кэмерона Смита существует также концепция под названием «совместное использование таблиц" (AKA "копирование при -write"), который откладывает копирование до тех пор, пока какая-либо исходная или целевая внутренняя таблица не будет изменена.
Если сильно упростить, то можно было бы представить это как присваивание как копию 8 байт (адрес исходной внутренней таблицы). В любом случае, большую часть времени будет изменена одна из 2-х внутренних таблиц (иначе зачем копия в коде!), так что конечная производительность часто почти одинакова, просто иногда есть польза из-за некоторых код "плохо" написан.
Я не могу сказать, что это полная причина (вероятно, за кулисами происходит что-то еще, чего я не знаю), но некоторые из причин определенно включают следующее. Здесь следует отметить: на малых и средних наборах данных разница в скорости незначительна.
t_table2 = t_table1
просто берет все данные и копирует их, перезаписывая t_table2
(это НЕ append
). В некоторых случаях (например, при передаче параметров) данные даже не копируются. Можно использовать одни и те же данные, и копия будет создана только в том случае, если необходимо изменить t_table2.
APPEND LINES OF t_table1 TO t_table2
в основном представляет собой цикл, который добавляет записи построчно.
Причина, по которой я упоминаю append
, заключается в том, что перезапись таблицы может быть такой же простой, как копирование данных (или ссылки на данные в редких случаях) из a
в b
, в то время как добавление выполняет проверки, отсортирована ли таблица, проиндексирована и т. д. Даже если таблица находится в самом базовом состоянии, добавление внутренней таблицы является несколько более сложной процедурой, чем перезапись переменной.
CallByValue
иCallByRef
почти одинаковы во многих языках программирования - person Felix D.   schedule 05.07.2018=
— это оператор присваивания, аAPPEND
добавляет (= копирует) строки. Почувствуйте разницу. - person Suncatcher   schedule 05.07.2018