Вход в личный кабинет:

Забыли пароль? | Регистрация

Адреса компании:

Санкт-Петербург

196158, Санкт-Петербург,
Пулковское шоссе, д. 30,
корп. 4, Лит. А, офис 203

Тел: +7 812 414 95 41

Москва

129085, г. Москва, проезд Ольминского, д. 3а, стр. 3, офис 706

Тел: +7 495 616 00 53

Блог

26.08.2015

Progress OpenEdge: промышленные средства репликации данных в Oracle и MS-SQL

Progress OpenEdge Pro2 Replication

Читать далее →




Десять причин перехода на новые версии OpenEdge (Progress)


Производительность кода ABL – копирование записей

Вернуться к списку постов

05.06.2012

Если Вам необходимо скопировать все поля одной записи в другую, Вы можете использовать один из трех методов:

1. Оператор RAW-TRANSFER
2. Оператор BUFFER-COPY
3. Оператор ASSIGN

Теоретически, наиболее быстрым является использование оператора RAW-TRANSFER, тогда как использование оператора ASSIGN для присваивания значений каждому полю является самым медленным и самым трудоемким по объему кода.

В то же время, при использовании оператора ASSIGN не требуется полного совпадения схемы для обеих записей и возможно условное присвоение полей с использованием опции WHEN.

CREATE Customer1.
ASSIGN
Customer1.CustNum = Customer.CustNum
Customer1. Name = Customer. Name

Для использования оператора BUFFER-COPY требуется совпадение типов копируемых полей и размерностей массивов. В то же время исходная и целевая записи могут иметь разное количество полей. Дополнительную гибкость оператору придают опции EXCEPT (позволяет явно исключить указанные поля из процесса копирования) и ASSIGN (позволяет явно присвоить значения указанным полям).

BUFFER-COPY Customer TO Customer1

Для использования оператора RAW-TRANSFER схемы для обеих записей должны быть полностью идентичны.

RAW-TRANSFER Customer TO Customer1

Как оператор BUFFER-COPY, так и оператор RAW-TRANSFER не требуют оператора CREATE для создания целевой записи – если такой записи нет в RECORD BUFFER, она будет создана.

Результаты измерений производительности по сравнению с оператором ASSIGN:

Тест

BUFFER-COPY, %

RAW-TRANSFER, %

Тесты от Dan Foreman (5000 записей, временные таблицы)

27

43

Авторский тест (Полное копирование таблицы Sports2000.Customer)

12

32


Александр Леоненко



3 комментария to “Производительность кода ABL – копирование записей”

Комментарии (3)
dmi:

Когда я в прошлом делал для нашего заказчика архивные срезы данных для отчетности — использовал только RAW-TRANSFER. А по крайней мере в v9 сильно подозреваю, что BUFFER-COPY это макрос, который разворачивается в обычный ASSIGN компилятором (мы по r-коду пытались понять)

dmi:

Только тогда непонятно, почему медленней работает. )

Dan Foreman утверждает (во всяком случае, для версии 9), что RAW-TRANSFER впятеро быстрее BUFFER-COPY и почти в 8 раз быстрее ASSIGN. Мне на его же тестах таких скоростей получить не удалось, что странно.
Не думаю, что BUFFER-COPY просто разворачивается в ASSIGN — работает все-таки быстрее, а ASSIGN в тестах правильный, групповой по всем полям.
Кроме того, основное назначение ASSIGN — присвоение буфера экрана буферу записи, в BUFFER-COPY такой функционал не нужен, так что реализация должна быть разной.

Добавить свой комментарий

Ваше имя*:
Ваш E-mail*:
Ваш комментарий*:

Компьютерные системы для бизнеса
© 2010 - 2017 Все права на материалы, находящиеся на этом сайте, охраняются в соответствии с законодательством РФ, в том числе, об авторском праве и смежных правах. При любом использовании материалов сайта ссылка на источник обязательна.