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

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

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

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

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 – сравнение целых чисел

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

06.06.2012

При сравнении строк, когда требуется проверить, принимает ли переменная одно из заданных значений, рекомендуется использовать встроенные функции LOOKUP, CAN-DO или INDEX вместо множественных сравнений в операторе IF, связанных OR. Функции работают быстрее и позволяют уменьшить размер R-кода.

Эта же техника может быть использована для сравнения целых чисел, для этого необходимо лишь преобразовать их в символьные строки.

Приведенный тест показывает, что и в этом случае встроенные функции работают быстрее, несмотря на затраты на преобразование чисел.

DEFINE VARIABLE iAccount AS INTEGER NO-UNDO.
DEFINE VARIABLE i AS INTEGER     NO-UNDO.
DEFINE VARIABLE a AS CHARACTER   NO-UNDO.
iAccount = 7.
 
ETIME(TRUE).
DO i = 1 TO 1000000:
a = "BASE".
END.
MESSAGE a ETIME
VIEW-AS ALERT-BOX INFO BUTTONS OK.
ETIME(TRUE).
DO i = 1 TO 1000000:
IF iAccount = 3
OR iAccount = 5
OR iAccount = 7 THEN a = "IF".
END.
MESSAGE a ETIME
VIEW-AS ALERT-BOX INFO BUTTONS OK.
ETIME(TRUE).
DO i = 1 TO 1000000:
IF LOOKUP(STRING(iAccount),'3,5,7') > 0 THEN a = 'LOOKUP'.
END.
MESSAGE a ETIME
VIEW-AS ALERT-BOX INFO BUTTONS OK.
ETIME(TRUE).
DO i = 1 TO 1000000:
IF INDEX('357', STRING(iAccount)) > 0 THEN a = 'INDEX'.
END.
MESSAGE a ETIME
VIEW-AS ALERT-BOX INFO BUTTONS OK.
ETIME(TRUE).
DO i = 1 TO 1000000:
IF CAN-DO('3,5,7', STRING(iAccount)) THEN a = 'CANDO'.
END.
MESSAGE a ETIME
VIEW-AS ALERT-BOX INFO BUTTONS OK.

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

OR

LOOKUP

INDEX

CAN-DO

Базовая производительность

14%

22%

27%

Из недостатков следует отметить невозможность индексного поиска в базе данных при использовании таких конструкций в выражении WHERE, а также неприменимость функции INDEX для сравнения двузначных (и более) чисел.

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


6 комментариев to “Производительность кода ABL – сравнение целых чисел”

Комментарии (6)
dmikai:

Для полноты картины может ещё такой блок добавить?

DO i = 1 TO 1000000:
CASE iAccount:
WHEN 3 OR
WHEN 5 OR
WHEN 7 THEN a = «CASE».
END CASE.
END.

Игорь:

Как ведут себя функции LOOKUP(), CAN-DO() и блок CASE с повышением «значности» ?

Белоусов Илья:

А откуда такие проценты?

Я прогнал вашу программу:
Base 288
OR 758
LOOKUP 754
INDEX 729
CAN-DO 681

Вычитаем отовcюду Base (для исключения накладных расходов на цикл) и переводим в проценты:
OR 470 = 100%
LOOKUP 466 = 99,1%
INDEX 441 = 93,8%
CAN-DO 393 = 83,6%

Что я сделал не так?

Белоусов Илья:

А если для чистоты эксперимента, чтобы исключить оптимизацию при компиляции, вставить в каждый цикл строку:
iAccount = RANDOM ( 0 , 9 ) .

То получится:
Base 524
OR 853
LOOKUP 893
INDEX 892
CAN-DO 824

Или в процентах:
OR 100%
LOOKUP 112,1%
INDEX 111,8%
CAN-DO 91,2%

Илья, я указывал «выигрыш», в Вашем первом тесте он получился от 1 до 16%, что меньше, чем у меня, конечно…
Это бывает, как писал Dan Foreman —
The first rule of benchmarking:
Your benchmarking mileage will vary, or stated in a different way, no two people will have the same results from a benchmark.
The second rule of benchmarking:
The possibilites for different testing configuration are endless…
Third rule of benchmarking:
Benchmarks are NOT applications.

Так что различие в результатах одного и того же теста вполне возможно. Хотя качественная картина должна совпадать. Чего не наблюдается в Вашем втором тесте…
Кстати, а сколько раз выполнялся тест? Я обычно выполняю 12 тестов, лучший и худший отбрасываю, по остальным считаю среднее.

Да, еще одно замечание, по рекомендации того же Дэна Формана тест всегда пишется в расчете на худший случай. Именно поэтому в моем тесте проверяется значение ‘7’.

И еще, я, честно говоря, не верю, что компилятор ABL выполняет какую-либо оптимизацию кода. Во всяком случае стопроцентно очевидную оптимизацию последовательных присвоений он не делает — помните про оператор ASSIGN?

dmikai:

А качественная картина тоже может не совпадать из-за битности, операционной системы и железа.

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

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

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