Re: Вдогонку к array



Posted by Аркадий Водяник on August 19, 1999 at 02:17:37:

In Reply to: Вдогонку к array posted by Владимир Секретев, Клуб Любителей Бухгалтерского Учета on August 18, 1999 at 12:32:49:


: Я не отыскал в профиле, получаемом директивой % статистики на оператор array.
: Его там нет, или я плохо искал?

Цитирую фрагмент из сообщения о Профилере:


Профилер показывает pаспpеделение вpемени:
a)между pазличными фазами пеpесчета состояния Сеpвеpа;
b)между файлами-коэффициентами;
c)между командами виpтуальной машины, находящимися в файлах-коэффициентах;
d)между стpоками исходного текста файла-коэффициента или фоpмы.

Еще раз подчеркну пункт c): "в файлах-коэффициентах".
Профилер не показывает статистику команд виртуальной
машины, находящихся в формах; для форм выдается только
информация из пункта d).

Итак, чтобы увидеть статистику "array %" в тексте
выдаваемом Профилером, можно завести фиктивный тестовый
вид операции, в файле-коэффициенте которого поместить
array %. Далее, надо выполнить форму с [set %...] и
ввести эту тестовую операцию. После этого директива %
покажет статистику команды "array %".

Из сообщения В.Секретева 1512:

: Так что же должен делать array? Всего только присваивать нулевому элементу
: массива значение 0. При извлечении элемента массива производится сравнение
: запрашиваемого индекса со значением, хранящемся в нулевом элементе массива.
: В том случае, если индекс оказывается больше, возвращается 0. При этом даже
: поиск элемента массива выполнять нет никакой необходимости. Наверно это
: будет работать очень быстро.

Элементы массива не надо искать. На то и массивы
с числовыми индексами.
A теперь, Володя, такой пример.
Допустим, что гипотетический оператор "sarray буква"
работает так, как ты предлагаешь - просто заносит 0
в нулевой элемент массива. Что сделает такой фрагмент?:


.....
sarray a
[a 1000,1]
x=[a 500]

Понятно, что в x поступит, возможно, не 0 - а "мусор" от
предыдущих вычислений. Ведь не всегда массив заполняется
с последовательным возрастанием номера индекса.

Далее:

:Спору нет, память высвобождать надо. Но делать это оператором "array буква" нет смысла, так как в
:настоящий момент, как я понимаю, все массивы инициализируются, т. е. память от них высвобождается ПЕРЕД
:выполнением формы. Таким образом, ОДНОКРАТНОЕ применение array в начале формы или в ее конце
:бессмысленно, ибо оно и так производится неявно. Из этого следует, что применять "array буква" пользователи
:будут только в случае необходимости МНОГОКРАТНО "сбросить" массив, с целью заполнить его новыми
:данными. Если предполагается, что массив после array будет снова заполнен, то зачем память перед этим
:высвобождать, чтобы потом опять захватывать?

Так если предполагается, что массив будет снова
использован и примерно с той же целью и в том же
объеме - зачем тогда вообще использовать "array буква"?
Только ради [a 0]?

Но освобождать память - это все же лучше, чем ничего
не делать перед следующим использованием массива.

Во первых, операционной системе будет "легче дышать",
будет меньше свопинг и т. д.: напомню, что массивы
располагаются вне контекстов D и D'. А может, на
следующей итерации формы не потребуется так же много
элементов массива, как на предыдущей?

Во вторых, обнулить элементы массива - это
дольше, чем освободить память страниц хранения.
А не обнулять - то ли прямым обнулением, то ли
освобождением памяти - опасно: это источник ошибок.
Рассчитывать на то, что программист не забудет
инициализировать массив, не приходится. Да и будет
это работать долго. Сравним профили:


Вpеменной пpофиль фоpмы S1
### 18.8% 938¦0002 for i=1 to 770000
############## 73.1% 3643¦0003 [a i,1]
# 8.0% 398¦0004 endfor
~ ~¦0005
~ 5¦0006 array a


Вpеменной пpофиль фоpмы S2
# 9.2% 889¦0002 for i=1 to 770000
####### 37.5% 3623¦0003 [a i,1]
4.1% 394¦0004 endfor
~ ~¦0005
## 9.9% 962¦0006 for i=1 to 770000
####### 35.5% 3433¦0007 [a i,0]
3.8% 370¦0008 endfor

Видно, что "ручная" инициализация массива заняла около
5с, а оператор array справился за 5мс. В 1000 раз быстрее.
(машина с P233).




Пpишедшие ответы: