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

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

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

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

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 – формирование списков

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

10.07.2012

Одна из стандартных задач – формирование в переменной разделенного запятыми списка значений из базы данных. Например, для заполнения combo-box или selection-list.

Для этих объектов определен встроенный метод ADD-LAST, решающий задачу. Проблема в том, что этот метод работает медленно. Гораздо быстрее сформировать список «вручную» в переменной. Для объектов combo-box или selection-list этот сформированный список затем может быть присвоен атрибуту LIST-ITEMS.

Приведенный ниже пример иллюстрирует возможные методы решения задачи и позволяет оценить производительность. Цикл «base» позволяет оценить и исключить из сравнения затраты на чтение записей. Заметим, что цикл «simple» оставляет в начале списка запятую (или другой разделитель). В некоторых случаях это допустимо, иначе эта запятая должна быть удалена – либо с помощью функции SUBSTRING, либо с помощью функции LEFT-TRIM. Функцию LEFT-TRIM использовать нельзя, если в списке могут быть пустые значения.

Еще два метода («if» и «min») используют функцию IF или MINIMUM, для формирования списка без лидирующей запятой. Представляется, что такие циклы должны работать несколько медленнее, чем серия циклов «simple», так как на каждой итерации производится вызов функции для сравнения. Dan Foreman утверждает, что MINIMUM работает на 10-12% быстрее, чем IF.

Результаты проведенных автором тестов (по базе Sports2000) приведены в таблице.

Тест

Время выполнения, %

Метод 1 – Simple

Base (100%)

Метод 2 – Simple / Substr

101

Метод 3 – MINIMUM

102

Метод 4 — IF

103

Метод 5 – Simple / Trim

104

Метод 6 – ADD-LAST

904


Как видно, значимой разницы в производительности при формировании списков «вручную» нет – весь диапазон производительности не превышает 4% (0.3 миллисекунды на моей системе). Функция MINIMUM действительно несколько быстрее функции IF, но всего лишь на 1%. Довольно странный результат показан в тесте «Simple / Trim», возможно, это просто статистический выброс, хотя данные усреднялись по 30 тестовым запускам. Ну и наконец, метод ADD-LAST работает в 9 раз медленнее, чем любой из «ручных» методов.

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

Тестовая программа:

DEFINE VARIABLE sel-list AS CHARACTER  NO-UNDO
VIEW-AS SELECTION-LIST SIZE 5 BY 5.
DEFINE VARIABLE v-list   AS CHARACTER  NO-UNDO.
DEFINE FRAME a sel-list.
ETIME(TRUE).
FOR EACH customer NO-LOCK:
END.
MESSAGE ETIME "base" VIEW-AS ALERT-BOX INFO BUTTONS OK.
ETIME(TRUE).
FOR EACH customer NO-LOCK:
sel-list:ADD-LAST(string(customer.custnum)).
END.
MESSAGE ETIME "sel-list" VIEW-AS ALERT-BOX INFO BUTTONS OK.
v-list = "".
ETIME(TRUE).
FOR EACH customer NO-LOCK:
v-list = v-list + (IF v-list = "" THEN "" ELSE ",") + string(customer.custnum).
END.
MESSAGE ETIME "if" VIEW-AS ALERT-BOX INFO BUTTONS OK.
v-list = "".
ETIME(TRUE).
FOR EACH customer NO-LOCK:
v-list = v-list + "," + string(customer.custnum).
END.
MESSAGE ETIME "simple" VIEW-AS ALERT-BOX INFO BUTTONS OK.
v-list = "".
ETIME(TRUE).
FOR EACH customer NO-LOCK:
v-list = v-list + "," + string(customer.custnum).
END.
v-list = LEFT-TRIM(v-list,",").
MESSAGE ETIME "simple trim" VIEW-AS ALERT-BOX INFO BUTTONS OK.
v-list = "".
ETIME(TRUE).
FOR EACH customer NO-LOCK:
v-list = v-list + "," + string(customer.custnum).
END.
v-list = SUBSTR(v-list,2).
MESSAGE ETIME "simple substr" VIEW-AS ALERT-BOX INFO BUTTONS OK.
v-list = "".
ETIME(TRUE).
FOR EACH customer NO-LOCK:
v-list = v-list + MINIMUM(v-list,",") + string(customer.custnum).
END.
MESSAGE ETIME "minimum" VIEW-AS ALERT-BOX INFO BUTTONS OK.

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

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

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