Форум

Форум (http://www.automationlabs.ru/forum/index.php)
-   Программирование в LabVIEW (http://www.automationlabs.ru/forum/forumdisplay.php?f=2)
-   -   Левая точка при Show buffer allocation (http://www.automationlabs.ru/forum/showthread.php?t=1077)

Chu 11.01.2007 16:53

Левая точка при Show buffer allocation
 
Вложений: 1
Кто мне обоснует наличие точки в кружке ? Версия 8.0.1

Как при таком раскладе вообще можно оптимизировать алгоритм :) ?

Fakir 11.01.2007 17:06

То есть почему там выделяется память?

iei 11.01.2007 17:09

Цитата:

Сообщение от Chu (Сообщение 4457)
Кто мне обоснует наличие точки в кружке ? Версия 8.0.1

У тебя данные (размер, значение) в Shift Registеr меняться могут?Могут! Под это дело он и выделяет память!

Chu 11.01.2007 17:22

Цитата:

Сообщение от iei (Сообщение 4459)
У тебя данные (размер, значение) в Shift Registеr меняться могут?Могут! Под это дело он и выделяет память!

Я подумал что анализатор кода более интеллектуальный, и в зависимости от используемых функций решает может ли массив динамически менять размер или нет. На приведеном рисунке одназначно видно что размер не меняется, специально replace использую да еще с константами.

ipc 11.01.2007 17:48

Цитата:

Сообщение от Chu (Сообщение 4465)
Я подумал что анализатор кода более интеллектуальный, и в зависимости от используемых функций решает может ли массив динамически менять размер или нет. На приведеном рисунке одназначно видно что размер не меняется, специально replace использую да еще с константами.

Да нет при любом пересечении границ циклов или кейсов выделяется память.NI работает над оптимизатором кода но пока эта фича очень сырая.

step 11.01.2007 19:12

Цитата:

Сообщение от Chu (Сообщение 4457)
Кто мне обоснует наличие точки в кружке ? Версия 8.0.1
Как при таком раскладе вообще можно оптимизировать алгоритм :) ?

Лабвьюшный компилятор в подобных примерах творит чудеса. Замени
константу на терминале dimension size контролом и вуаля — кружок исчензнет :) (LV 8.0.1)

ЗЫ: лучшую оптимизацию даст только auto-indexing

UPDATE:
Еще я немного поэкспериментировал, и стало понятно следующее:
1) Если на Initialize Array поданы параметры-константы, память под массив выделяется до запуска VI, как-бы "статически".
2) "Статически" выделенный массив при переходе через границу цикла перевыделяется. "Нестатические" массивы в простых случаях не перевыделяются.
3) Память при таком перевыделении не утекает — новой памяти отнимается строго под один массив.
4) Судя по скорости выполнения, перевыделение происходит один раз при входе в цикл, а не на каждой его итерации.
5) LabVIEW не всегда вылетает, если Memory is full :eek:
6) auto-indexing работает в два раза быстрее чем это :)

Вывод: Перевыделение массива в цикле приводит к увеличению загрузки памяти на один размер массива, а на скорости (если конечно память не свопится) практически не сказывается.

step 11.01.2007 19:15

Цитата:

Сообщение от ipc (Сообщение 4468)
Да нет при любом пересечении границ циклов или кейсов выделяется память

Это, кстати, далеко не так, особенно по отношению к кейсам.

iei 12.01.2007 09:22

Цитата:

Сообщение от step (Сообщение 4480)
Лабвьюшный компилятор в подобных примерах творит чудеса. Замени
константу на терминале dimension size контролом и вуаля — кружок исчензнет :) (LV 8.0.1)

ЗЫ: лучшую оптимизацию даст только auto-indexing

UPDATE:
Еще я немного поэкспериментировал, и стало понятно следующее:
[__SKIP__]
5) LabVIEW не всегда вылетает, если Memory is full :eek:

Как проверял, методику в студию!

step 12.01.2007 14:43

Цитата:

Сообщение от iei (Сообщение 4489)
Как проверял, методику в студию!

Да ничего особенного — Profile/Performance and Memory, ProcessExplorer и массив на несколько сотен мегов )

Chu 12.01.2007 14:50

Цитата:

Сообщение от step (Сообщение 4480)
Лабвьюшный компилятор в подобных примерах творит чудеса. Замени
константу на терминале dimension size контролом и вуаля — кружок исчензнет :) (LV 8.0.1)

ЗЫ: лучшую оптимизацию даст только auto-indexing

UPDATE:
Еще я немного поэкспериментировал, и стало понятно следующее:
1) Если на Initialize Array поданы параметры-константы, память под массив выделяется до запуска VI, как-бы "статически".
2) "Статически" выделенный массив при переходе через границу цикла перевыделяется. "Нестатические" массивы в простых случаях не перевыделяются.
3) Память при таком перевыделении не утекает — новой памяти отнимается строго под один массив.
4) Судя по скорости выполнения, перевыделение происходит один раз при входе в цикл, а не на каждой его итерации.
5) LabVIEW не всегда вылетает, если Memory is full :eek:
6) auto-indexing работает в два раза быстрее чем это :)

Вывод: Перевыделение массива в цикле приводит к увеличению загрузки памяти на один размер массива, а на скорости (если конечно память не свопится) практически не сказывается.

Во-первых автоиндексация это что ? Во-вторых рекомендации, при большом объеме обрабатываемых данных инициализировать сразу динамический массив (но работать с ним как со статическим) ?

step 12.01.2007 15:16

Вложений: 3
Цитата:

Сообщение от Chu (Сообщение 4503)
Во-первых автоиндексация это что ?

См. первый скриншот.

Цитата:

Сообщение от Chu (Сообщение 4503)
Во-вторых рекомендации, при большом объеме обрабатываемых данных инициализировать сразу динамический массив (но работать с ним как со статическим)

Пока вижу только онин способ — не подавать константу на вход initialize array. Но заморачиваться с этим стоит только при реально больших массивах .

iei 12.01.2007 18:16

Вложений: 3
Цитата:

Сообщение от step (Сообщение 4506)
См. первый скриншот.
Пока вижу только онин способ — не подавать константу на вход initialize array. Но заморачиваться с этим стоит только при реально больших массивах .

Вобщем так, вскрытие предварительно показало:
На рисунке 2 – память выделяется один раз
На рисунке 1 – память то же выделяется один раз (если не считать выделение памяти под константу)
На рисунке 3 – память выделяется так же один раз! Но по коду больше, ибо лабвью надо обратиться к фронт панели и вообще он более громоздкий.
Различия:
Рис 1 и 2 – используют один механизм выделения памяти, рис 3 свою собственную
ЗЫ:
Честное слово – больше так делать не буду!

step 12.01.2007 19:05

На самом деле:
На рисунке 2 - память выделяется два раза (первый раз — до запуска VI), соответственно 2 кружочка allocation buffer
На рисунке 1 - абсолютно то же самое, что и на рис. 2
На рисунке 3 - один раз после запуска VI, соответственно 1 кружочек

iei 13.01.2007 12:52

Цитата:

Сообщение от step (Сообщение 4510)
На самом деле:
На рисунке 2 - память выделяется два раза (первый раз — до запуска VI), соответственно 2 кружочка allocation buffer
На рисунке 1 - абсолютно то же самое, что и на рис. 2
На рисунке 3 - один раз после запуска VI, соответственно 1 кружочек

Откуда такая уверенность?:)

step 13.01.2007 14:29

Цитата:

Сообщение от iei (Сообщение 4519)
Откуда такая уверенность?:)

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

iei 13.01.2007 15:06

Цитата:

Сообщение от step (Сообщение 4521)
Дык говорю ж, более чем отчетливо видно по загрузке памяти, когда массивы большие.

Если не брать в расчет секцию инициализации, где память выделяется под все что можно(?) и все что нельзя. А рассматривать только диаграммы на рисунке. То алгоритм работы программы для всех приведенных вариантов, в коде примерно выглядит так:
1) выделение памяти (с константой: выделение нового участка и копирование туда значения константы)
2) Replace (сделано относительно не плохо)
3) Rotate 1-d array
4) Jmp на 2
Отмечу лишь что это простой вариант и из него мало что понятно. Было бы не плохо его усложнить, добавив хотя бы еще один цикл. Но у меня времени пока нет с этим копаться. И если у кого то есть желание заняться анализом кода (Chu?) для разрешения данного спора – то милости прошу!:D

step 13.01.2007 17:33

Цитата:

Сообщение от iei (Сообщение 4522)
Если не брать в расчет секцию инициализации, где память выделяется под все что можно(?) и все что нельзя.

Еще раз повторюсь: если массив БОЛЬШОЙ(скажем, сто мегабайт), то хотя бы в таск мэнэджере отчетливо видно, когда память выделяется под него, когда память выделяется под него еще раз, и когда эта память освобождается. Память под все остальное — это единицы килобайт, которые никак не мешают.

iei 15.01.2007 12:12

Цитата:

Сообщение от step (Сообщение 4525)
Еще раз повторюсь: если массив БОЛЬШОЙ(скажем, сто мегабайт), то хотя бы в таск мэнэджере отчетливо видно, когда память выделяется под него, когда память выделяется под него еще раз, и когда эта память освобождается. Память под все остальное — это единицы килобайт, которые никак не мешают.

Можешь не повторяться, ты все правильно сказал.
И с твоего позволения, я немного дополню твои исследования!;) Как ты правильно заметил, статическая инициализация памяти происходит всего скорей до исполнения кода, возможно даже не зависимо от того будет ли он исполняться или нет. Но, блок, “Initialize 1-d array” ни кто не отменял! Т.е. если память уже выделена, то он ее перевыделит в уже выделенном участке. И только поэтому ты не смог увидеть “нового” выделения памяти в таск менеджере!

step 15.01.2007 14:58

Цитата:

Сообщение от iei (Сообщение 4529)
Можешь не повторяться, ты все правильно сказал.
И с твоего позволения, я немного дополню твои исследования!;) Как ты правильно заметил, статическая инициализация памяти происходит всего скорей до исполнения кода, возможно даже не зависимо от того будет ли он исполняться или нет.

Кстати да, не зависимо от того будет ли он исполняться или нет

Цитата:

Сообщение от iei (Сообщение 4529)
Но, блок, “Initialize 1-d array” ни кто не отменял! Т.е. если память уже выделена, то он ее перевыделит в уже выделенном участке. И только поэтому ты не смог увидеть “нового” выделения памяти в таск менеджере!

Выделение памяти — по определению выделение новой памяти, а не использование старой. Может ты имел ввиду сначала освобождение а затем сразу выделение? Но это можно отследить в таскмэнэджере выполняя прогу пошагово — короче этого не происходит.

Я глубоко убежден, что Initialize Array с константами на входе при компиляции превращается в "статический" массив, и никаких команд по выделению памяти за ним больше не стоит.

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

iei 15.01.2007 15:08

Цитата:

Сообщение от step (Сообщение 4534)
Я глубоко убежден, что Initialize Array с константами на входе при компиляции превращается в "статический" массив, и никаких команд по выделению памяти за ним больше не стоит.

Тогда рекомендую воспользоваться любым отладчиком!:cool:
Цитата:

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


Часовой пояс GMT +3, время: 12:55.

vBulletin v3.6.1, Copyright ©2000-2020, Jelsoft Enterprises Ltd.
Русский перевод: zCarot, Vovan & Co