Изображение квадрата Дюрера

ООО АВТОМАТИКА плюс

Rambler's Top100

Рейтинг@Mail.ru

Справочная система




Доступ к элементам массива

Эффективность работы любой системы сильно зависит от эффективности самого слабого звена системы. В вычислительной системе самое слабое звено - доступ к элементам массива. К счастью, в нашей системе эта проблема полностью решена, и каждый разработчик может выбрать для себя наиболее подходящий способ. По сравнению с системой Matlab наша система здорово выигрывает в плане доступа к элементам массива - скорость доступа у нас выше на порядок. Рассмотрим способы доступа от простого (медленного) к сложному (быстрому).

  1. Свойство Elem[const Name: string; Row, Col: Integer]: Real. Как видите, для того, чтобы прочитать или изменить какой-либо элемент массива, мы должны передать имя массива, номер строки и номер столбца. Функция по имени массива должна определить его адрес и число столбцов - налицо выполнение операции поиска. Функция при каждом вызове выполняет поиск массива с именем Name, в результате чего скорость доступа падает в 3-4 раза.
  2. Свойство ElemI[Idx, Row, Col: Integer]: Real. Здесь вместо имени массива мы должны передать его индекс. В данном случае поиск выполнять не нужно. Однако функция должна извлечь адрес массива и число столбцов - а это дополнительные затраты, из-за которых скорость доступа падает в 1.5 раза.
  3. Свойство ElemFast[Adr, Row, Col, ColCount: Integer]: Real. Здесь программист должен сам заранее узнать адрес массива и число столбцов. Функция быстрее, чем обе предыдущие, однако и ее скорость не максимальна. Ее целесообразно применять только для двухмерных массивов.
  4. Следующий способ заключается в использовании массивов указателей. Вы должны объявить переменную типа PRealArray и присвоить ей значение с помощью функции GetRowAddress(). Пример:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      RArray: PRealArray;
      I, J, Rows, Cols, Idx: Integer;
    begin
      with Base do
      begin
        // Создаем массив случ. чисел 5 х 10
        RandomAr('A', 5, 10);
        // Запоминаем размеры и индекс
        Idx := GetSize('A', Rows, Cols);
        // Далее нужно возвести все эл-ты в квадрат
    
        for I := 1 to Rows do
        begin
          RArray := GetRowAddress(Idx, I);
          for J := 0 to Cols - 1 do
            RArray[J] := RArray[J] * RArray[J];
        end;
      end;
    
    end;
    
  5. Самый быстрый способ, но в нем используются операции с указателем. Пример:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      R: ^Real;
      I: Integer;
    begin
      with Base do
      begin
        // Создаем массив случ. чисел 5 х 10
        RandomAr('A', 5, 10);
    
        // Далее нужно возвести все эл-ты в квадрат
        R := GetRowAddress('A');
        for I := 1 to GetSize('A') do
        begin
          R^ := R^ * R^;
          Inc(Integer(R), 8);
        end;
      end;
    end;
    
    Данный метод можно успешно использовать при потоковой обработке всех элементов массива.
Логинов Дмитрий © 2005-2015