Мой тест
Методика:
Код выполнялся в PLCWinNT v2.4 в freeweeling задаче с отключенным watchdog таймером.
Измерялась длительность одного цикла задачи таймером TON.
Измерения повторялись несколько раз. Разброс результатов 2-5%.
Область объявлений:
Код:
VAR CONSTANT
MAX_ELEMENT: INT := 32000;
ITERATIONS_NUMBER: INT:=10000;
END_VAR
VAR
destination: ARRAY [0..MAX_ELEMENT] OF BYTE;
destinationPtr: POINTER TO BYTE;
sourcePtr: POINTER TO BYTE;
source: ARRAY [0..MAX_ELEMENT] OF BYTE := 8, MAX_ELEMENT(8);
i: INT;
j: UDINT;
END_VAR
Код №1. Используется SysMemLib.
Время выполнения 78 мс.
Код:
FOR j:= 1 TO ITERATIONS_NUMBER DO
SysMemMove(dwDest:=ADR(destination),
dwSrc:=ADR(source), dwCount:=MAX_ELEMENT+1);
END_FOR
Код №2. Используется косвенная адрессация через указатели
Время выполнения 7856 мс.
Код:
FOR j:= 1 TO ITERATIONS_NUMBER DO
sourcePtr:= ADR(source);
destinationPtr:= ADR(destination);
FOR i:= 0 TO MAX_ELEMENT DO
destinationPtr^ := sourcePtr^;
destinationPtr := destinationPtr+1;
sourcePtr:=sourcePtr+1;
END_FOR
END_FOR
Код №3. Используется адресация по индексу в массиве
Время выполнения 3860 мс.
Код:
FOR j:= 1 TO ITERATIONS_NUMBER DO
FOR i:= 0 TO MAX_ELEMENT DO
destination[i] := source[i];
END_FOR
END_FOR
Цикл по j во всех вариантах добавлен для увеличения точности измерения.
Комментарии и критика "чистоты эксперимента" приветствуются.