2013-05-13 5 views

ответ

8

READ будет читать запись с диска и возвращать ее как Dynamic Array. MATREAD будет читать запись с диска и возвращать ее как Dimensioned Array.

Итак, реальный трюк заключается в том, чтобы определить, какой тип массива более применим для вашего прецедента.

A Dynamic Array - это, по существу, строка, которая использует определенные байтовые маркеры для разграничения каждого элемента (атрибута/многозначности/подвычисления). Он чрезвычайно прост в использовании, не требует предварительной декларации или определения размера. С другой стороны, если он может быть медленнее, чем Dimensioned Array, в основном для больших записей или когда вы будете случайным образом извлекать атрибуты из массива - O (n log n), я думаю. Последовательный доступ оптимизирован и близок к скорости Dimensioned Arrays.

A Dimensioned Array по существу представляет собой массив строк (или Dynamic Arrays в случае UniVerse). Он считывает каждый атрибут в позицию массива. Каждая позиция массива будет состоять из Dynamic Array только для позиций с множеством/субвалютами этого атрибута. Dimensioned Arrays потребовали, чтобы вы объявили их и количество позиций массива вверх. В зависимости от используемого вами вкуса, это может привести к ошибке выполнения, если вы попытаетесь прочитать запись с большим количеством атрибутов, чем размер массива. С другой стороны, O (1) извлекает атрибуты из массива, независимо от вашего шаблона доступа.

+2

Дан - хорошее объяснение. Я думаю, что доступ к динамическому массиву - O (n). Взбитый быстрый тест и ниже приведены результаты: 'Время доступа к позиции: 50000 = 0 мс. Время доступа к позиции: 100000 = 1 мс. Время доступа к позиции: 200000 = 3 мс. Время доступа к позиции: 500000 = 8 мс. Время доступа к позиции: 1000000 = 15 мс. Время доступа к позиции: 5000000 = 76 мс. Время доступа к позиции: 10000000 = 153 ms.' Последние примеры пара показывают довольно хорошую линейную прогрессию. –

+1

Спасибо Шон - вы правы. Единственный доступ - O (n). Я думал о доступе ко всем элементам, который является O (n) для размеров и O (n^2) для динамических. –

+0

Дэн - просто хотел добавить, что это отличный ответ. Очень прямой и хорошо информированный. –

2

MATREADU связывает MATPARSE с ЧИТАЕМОЙ. Они вызывают атрибуты динамического массива в размерном или фиксированном массиве. Это может быть более эффективным, если вы часто обращаетесь к массиву и более удобно, если вы читаете I-тип из DICTionary. READV читает только один атрибут массива. Стремитесь к ясности и оптимизации по мере необходимости.

Вот пример в UniVerse 4 линий, производящих один и тот же вывод:

dim dimarr1(9), dimarr2(9)          
open 'VOC' else abort           
matread dimarr1 from 'OLDSTYLE' then print dimarr1(1) else abort 
read dynarr from 'OLDSTYLE' then print dynarr<1> else abort  
matparse dimarr2 from dynarr ; print dimarr2(1)     
readv dynatt from 'OLDSTYLE', 1 then print dynatt else abort  
end