Мой тест

Методика:
Код выполнялся в 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 во всех вариантах добавлен для увеличения точности измерения.

Комментарии и критика "чистоты эксперимента" приветствуются.