> -- Александр Ильин писал(а):
> Получается, что поиск с использованием локальной процедуры выигрывает по всем статьям.Я тоже проверил в ББ. Сравнивал вариант со вложенной процедурой с симуляцией цикла Дейкстры с помощью LOOP.

При размере матрицы 1000*1000 вложенная процедура победила с отрывом в 28%,
но при размере матрицы 100*100 победил цикл Дейкстры с отрывом в 53%
(для матрицы 32*32 цикл Дейкстры победил с отрывом уже в 92%).

В общем, для больших матриц рулит вложенная процедура, для малых - симуляция цикла Дейкстры с помощью LOOP.

Интересно было бы ещё проверить в Oberon-07 в котором цикл Дейкстры "родной". Там, по идее, если компилятор не сглупит, ЦД должен бы побеждать и на больших матрицах тоже.

## Код:
```
MODULE TestSearch2D;

   IMPORT Log := StdLog, Services;

   CONST N = 1000;
      cpuClock = 2.21; (* частота моего процессора в гигагерцах *)

   VAR
      a: ARRAY 1000, 1000 OF INTEGER;
      i, j, v, n: INTEGER;
      t: LONGINT;
      dt: REAL;

   PROCEDURE FindInLine (IN a: ARRAY OF INTEGER; OUT pos: INTEGER): BOOLEAN;
      VAR i: INTEGER;
   BEGIN i := 0;
      WHILE (i < LEN(a)) & ~(a[i] = v) DO INC(i) END;
      pos := i;
      RETURN (i < LEN(a))
   END FindInLine;

BEGIN
   FOR i := 0 TO LEN(a, 0) -1 DO
      FOR j := 0 TO LEN(a, 1) -1 DO
         a[i, j] := 999
      END
   END;
   v := 1000;
   a[LEN(a, 0)-1, LEN(a, 1)-1] := v;

   (************************************)

   t := Services.Ticks();
   FOR n := 1 TO N DO
      i := 0; j := 0;
      LOOP IF (j < LEN(a, 1)) & ~(a[i, j] = v) THEN
         INC(j)
      ELSIF (j = LEN(a, 1)) & (i < LEN(a, 0)) THEN
         j := 0; INC(i)
      ELSE EXIT END END;
   END;
   dt := Services.Ticks() - t;
   Log.String("Симуляция цикла Дейкстры:"); Log.Ln;
   Log.String("i = "); Log.Int(i); Log.Ln;
   Log.String("j = "); Log.Int(j); Log.Ln;
   Log.Real(dt); Log.String(" секунд на весь тест"); Log.Ln;
   Log.Real(dt / N * 1000); Log.String(" микросекунд на один поиск"); Log.Ln;
   Log.Real(dt / N * 1000000 * cpuClock / (LEN(a, 0)*LEN(a, 1))); Log.String(" тактов на элемент"); Log.Ln;

   (************************************)

   t := Services.Ticks();
   FOR n := 1 TO N DO
      i := 0; j := 0;
      WHILE (i < LEN(a, 0)) & ~FindInLine(a[i], j) DO INC(i) END
   END;
   dt := Services.Ticks() - t;
   Log.String("Использование процедуры:"); Log.Ln;
   Log.String("i = "); Log.Int(i); Log.Ln;
   Log.String("j = "); Log.Int(j); Log.Ln;
   Log.Real(dt); Log.String(" секунд на весь тест"); Log.Ln;
   Log.Real(dt / N * 1000); Log.String(" микросекунд на один поиск"); Log.Ln;
   Log.Real(dt / N * 1000000 * cpuClock / (LEN(a, 0)*LEN(a, 1))); Log.String(" тактов на элемент"); Log.Ln
END TestSearch2D.
```
