|
Справочная система
Доступ к элементам массива
Эффективность работы любой системы сильно зависит от эффективности самого слабого
звена системы. В вычислительной системе самое слабое звено - доступ к элементам
массива. К счастью, в нашей системе эта проблема полностью решена, и каждый
разработчик может выбрать для себя наиболее подходящий способ. По сравнению с
системой Matlab наша система здорово выигрывает в плане доступа к элементам
массива - скорость доступа у нас выше на порядок. Рассмотрим способы доступа
от простого (медленного) к сложному (быстрому).
- Свойство Elem[const Name: string; Row, Col: Integer]: Real. Как видите,
для того, чтобы прочитать или изменить какой-либо элемент массива, мы должны
передать имя массива, номер строки и номер столбца. Функция по имени массива
должна определить его адрес и число столбцов - налицо выполнение операции поиска.
Функция при каждом вызове выполняет поиск массива с именем Name, в результате
чего скорость доступа падает в 3-4 раза.
- Свойство ElemI[Idx, Row, Col: Integer]: Real. Здесь вместо имени массива
мы должны передать его индекс. В данном случае поиск выполнять не нужно. Однако
функция должна извлечь адрес массива и число столбцов - а это дополнительные затраты,
из-за которых скорость доступа падает в 1.5 раза.
- Свойство ElemFast[Adr, Row, Col, ColCount: Integer]: Real. Здесь
программист должен сам заранее узнать адрес массива и число столбцов. Функция
быстрее, чем обе предыдущие, однако и ее скорость не максимальна. Ее целесообразно
применять только для двухмерных массивов.
- Следующий способ заключается в использовании массивов указателей. Вы должны
объявить переменную типа 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;
- Самый быстрый способ, но в нем используются операции с указателем. Пример:
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;
Данный метод можно успешно использовать при потоковой обработке всех элементов массива.
|