Показано с 1 по 10 из 32

Тема: Работа с массивами

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Эмулятор не показатель, а в PLCWinNT оба варианта дают менее 1 мс

  2. #2
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

    Цитата Сообщение от Логвиненко Андрей Посмотреть сообщение
    Эмулятор не показатель
    SysMemLib это внешняя библиотека. А внешние библиотеки не работают на эмуляторе.

  3. #3
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    Lightbulb

    Мой тест

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

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

  4. #4
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

    Вот проект с тестом
    Вложения Вложения

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •