Мой тест
Методика:
Код выполнялся в 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 мс.
Код №2. Используется косвенная адрессация через указателиКод:FOR j:= 1 TO ITERATIONS_NUMBER DO SysMemMove(dwDest:=ADR(destination), dwSrc:=ADR(source), dwCount:=MAX_ELEMENT+1); END_FOR
Время выполнения 7856 мс.
Код №3. Используется адресация по индексу в массивеКод: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
Время выполнения 3860 мс.
Цикл по j во всех вариантах добавлен для увеличения точности измерения.Код:FOR j:= 1 TO ITERATIONS_NUMBER DO FOR i:= 0 TO MAX_ELEMENT DO destination[i] := source[i]; END_FOR END_FOR
Комментарии и критика "чистоты эксперимента" приветствуются.![]()




Ответить с цитированием