Мне нужно понять разницу между MATREAD и READ? и, пожалуйста, укажите простой пример того, где и как его использовать.В чем разница между MATREAD и READ?
ответ
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) извлекает атрибуты из массива, независимо от вашего шаблона доступа.
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
Дан - хорошее объяснение. Я думаю, что доступ к динамическому массиву - O (n). Взбитый быстрый тест и ниже приведены результаты: 'Время доступа к позиции: 50000 = 0 мс. Время доступа к позиции: 100000 = 1 мс. Время доступа к позиции: 200000 = 3 мс. Время доступа к позиции: 500000 = 8 мс. Время доступа к позиции: 1000000 = 15 мс. Время доступа к позиции: 5000000 = 76 мс. Время доступа к позиции: 10000000 = 153 ms.' Последние примеры пара показывают довольно хорошую линейную прогрессию. –
Спасибо Шон - вы правы. Единственный доступ - O (n). Я думал о доступе ко всем элементам, который является O (n) для размеров и O (n^2) для динамических. –
Дэн - просто хотел добавить, что это отличный ответ. Очень прямой и хорошо информированный. –