Выделено: viewtopic.php?p=42858#p42858Интереса ради сравнил скорость выполнения трёх написанных мною примеров. Естественно, единица измерения - секунды, делённые на сферических попугаев в вакууме (сек/спв).
Взята матрица arr: ARRAY 1000, 1000 OF INTEGER (16-битные слова в XDS). Во все элементы помещены значения 999, и только последний элемент arr[999, 999] := 1000. Соответственно, сделан поиск значения 1000 тремя вышеприведенными программами по 1000 раз (взято минимальное значение времени из 11 запусков подряд).
Результаты замеров (чем меньше, тем лучше):
- один WHILE: 13.635 сек/спв;
- два вложенных WHILE: 6.804 сек/спв;
- с локальной процедурой: 2.422 сек/спв. WIN!
Потом подумал: "Ой, чего это я в отладочном режиме проверяю?!" Включил всю оптимизацию, отключил все рантайм-проверки и запустил снова.
Результаты (чем меньше, тем лучше):
- один WHILE: 2.376 сек/спв;
- два вложенных WHILE: 1.279 сек/спв;
- с локальной процедурой: 0.813 сек/спв; WIN!
Прирост производительности за счёт оптимизации составил (чем меньше, тем лучше):
- один WHILE: 13.635/2.376=
5.7386;
- два вложенных WHILE: 6.804/1.279=
5.3198;
- с локальной процедурой: 2.422/0.813=
2.9791. WIN!
Получается, что поиск с использованием локальной процедуры выигрывает по всем статьям. В случае с включенной оптимизацией он в полтора раза быстрее двух вложенных WHILE (из-за вынужденных лишних IF-ов внутри, которые тормозят работу), и в три раза быстрее единственного WHILE. В случае с отключенной оптимизацией, то есть, когда всякие проверки индексов выполняются в полном объёме, он почти в три раза быстрее двух WHILE и в пять с половиной раз быстрее одного WHILE. При этом состоит из простейших компонентов - паттерновых линейных поисков - и увеличивает читабельность, давая процедурное имя внутреннему циклу. Как говорится, EPIC WIN.
Два вложенных WHILE вдвое быстрее одного WHILE, что тоже интересно. : )
Если кому-то хочется, могу выложить исходники проекта на XDS.