Страница 2 из 3

Re: Наилучший способ передачи множества параметров в SubVI

Добавлено: 20 янв 2016, 15:31
dadreamer
Pavel писал(а):Кластер чем неудобен, так это тем что при передачи в субвиай делается его копия. В принципе для референсов это будет не критично, но если передавать весь кластер со всеми данными (допустим супер кластер) то при большом проекте копирование кластера будет отъедать место.
Если так, то с этим вряд ли что-то можно сделать. Если даже передавать в SubVI кластер по указателю/DVR, то внутри подприбора всё равно придётся его вытаскивать из области памяти и получится копия. В этом плане у текстовых языков опять же есть преимущество:

Код: Выделить всё

void some_func(void *ptest_struct)
{
local_param = (test_struct *)ptest_struct->test_param;
}
Хотя, можно извернуться и скопировать только те параметры, что нужны в SubVI. Но придётся сделать много лишней работы наподобие MoveBlock и нужно знать, как данные лежат в памяти.

Re: Наилучший способ передачи множества параметров в SubVI

Добавлено: 20 янв 2016, 16:03
Artem.spb
1) Instead of creating a new buffer for the output, the compiler reuses the memory of the input buffer for the output buffer. This example of inplaceness saves memory and also results in faster execution because no memory allocation needs to take place at run time.
http://zone.ni.com/reference/en-XX/help ... ory_usage/

2) есть in place... структура, позволяющая обрабатывать элементы кластеров/массивов на месте.

Re: Наилучший способ передачи множества параметров в SubVI

Добавлено: 20 янв 2016, 17:41
Pavel
dadreamer писал(а):
Pavel писал(а): Если так, то с этим вряд ли что-то можно сделать. Если даже передавать в SubVI кластер по указателю/DVR, то внутри подприбора всё равно придётся его вытаскивать из области памяти и получится копия. В этом плане у текстовых языков опять же есть преимущество:

Код: Выделить всё

void some_func(void *ptest_struct)
{
local_param = (test_struct *)ptest_struct->test_param;
}
Хотя, можно извернуться и скопировать только те параметры, что нужны в SubVI. Но придётся сделать много лишней работы наподобие MoveBlock и нужно знать, как данные лежат в памяти.
Я это написал к тому что при использовании кластера нужно передавать не весь кластер а его часть-подкластер. Но я вижу этим вопросом ты владеешь лучше и глубже меня раз всплыли функции наподобие MoveBlock.
Artem.spb писал(а):это утверждение даже звучит нелогично.
что же в таком случае происходит с оригинальными данными?
Звучит может и не логично, но тогда это было так. Может сейчас что-то поменялось! А вот что происходит со старыми данными в нутрях LV я уже честно и не помню.( Когда то копались идай и ольгой но это было очень давно...

Re: Наилучший способ передачи множества параметров в SubVI

Добавлено: 20 янв 2016, 18:17
dadreamer
Pavel писал(а):Я это написал к тому что при использовании кластера нужно передавать не весь кластер а его часть-подкластер.
Ну, это снова лишняя разборка-сборка в Main :vi: , от чего я пытаюсь избавиться, ибо загромождает БД. Предложенный мной способ с DVR элегантнее. В Main'е создаём DVR и передаём в SubVI, а уже там можем делать что угодно:
2016-01-20_20-06-41.jpg
Можно, конечно, вместо DVR взять обычный указатель. Но если у нас кластер со ссылками (а не значениями контролов/индикаторов), то после всех манипуляций с памятью мы получаем "голые" числа U32/U64, потому что ссылка представляет собой magic cookie. То есть, потребуется потом числа переводить в ссылки Type Cast'ом и как-то сопоставлять ссылки их контролам/индикаторам. Короче, та ещё задача.

А вот интересно, здесь мы получаем копию кластера или нет?..
2016-01-20_20-06-41.jpg
Думаю, что да, несмотря на ухищрения.

Re: Наилучший способ передачи множества параметров в SubVI

Добавлено: 21 янв 2016, 00:34
Artem.spb
Pavel писал(а):Я это написал к тому что при использовании кластера нужно передавать не весь кластер а его часть-подкластер.
если так поступать, то естественно создаётся копия.

я всё же не увидел доказательств Вашего утверждения, что при сквозной передаче данных (судя по вашему утверждению не только кластера) через subvi порисходит копирование данных

Re: Наилучший способ передачи множества параметров в SubVI

Добавлено: 22 янв 2016, 07:55
Pavel
Ну хороша, а какое тогда у Вас видение???

Re: Наилучший способ передачи множества параметров в SubVI

Добавлено: 22 янв 2016, 08:52
Blackman
я всё же не увидел доказательств Вашего утверждения, что при сквозной передаче данных (судя по вашему утверждению не только кластера) через subvi происходит копирование данных
Да это может происходить при определенных условиях в subVI.

Re: Наилучший способ передачи множества параметров в SubVI

Добавлено: 22 янв 2016, 11:04
Artem.spb
Pavel писал(а):Ну хороша, а какое тогда у Вас видение???
моё видение я уже писал со ссылкой на документ:
Artem.spb писал(а):1) Instead of creating a new buffer for the output, the compiler reuses the memory of the input buffer for the output buffer. This example of inplaceness saves memory and also results in faster execution because no memory allocation needs to take place at run time.
http://zone.ni.com/reference/en-XX/help ... ory_usage/
Blackman писал(а):Да это может происходить при определенных условиях в subVI.
Вложения
17 - Managing Performance and Memory.pdf
(614.32 КБ) Скачиваний: 10
а точнее можно? читать 85 страниц для поиска определённых условий не хочется

Re: Наилучший способ передачи множества параметров в SubVI

Добавлено: 22 янв 2016, 11:08
Vitekkz88
Artem.spb писал(а): точнее можно? читать 85 страниц для поиска определённых условий не хочется
Солидарен!
Blackman, можно своими словами и по русски? Про определенные условия в subVI имеется ввиду.

Re: Наилучший способ передачи множества параметров в SubVI

Добавлено: 22 янв 2016, 19:22
Blackman
страница 19 Conditional Indicators and Data Buffers

Re: Наилучший способ передачи множества параметров в SubVI

Добавлено: 22 янв 2016, 19:33
Artem.spb
Blackman писал(а):страница 19 Conditional Indicators and Data Buffers
Это как раз НЕ является "сквозным проходом" данных через subVI. И не противоречит моему утверждению, что если вы передаёте блок данных в функцию, там меняете данные или используете их часть, после чего передаёте этот же кластер наружу.
Дополнительные индикаторы приводят к ветвлению проводников, что само собой приводит в дублированию данных.
но такие индикаторы если и и нужны, то только на этапе отладки, в конечной программе их логично убрать, если конечно subVI не является всплывающим окном.

Re: Наилучший способ передачи множества параметров в SubVI

Добавлено: 22 янв 2016, 19:59
Blackman
Здесь нет речи о дополнительных индикаторах. А говорится об условии при котором происходит копирование данных: если выходной терминал (пусть будет кластер) расположен в Case structure или For Loop.

Re: Наилучший способ передачи множества параметров в SubVI

Добавлено: 22 янв 2016, 20:26
Artem.spb
В принципе можно согласиться, но если индикатор располагается в кейс-структуре, то это не является сквозным прохождением проводника.

Re: Наилучший способ передачи множества параметров в SubVI

Добавлено: 22 янв 2016, 23:13
Borjomy_1
Но вообще-то, граждане, самым порочным в этом парадигме построения программы является передача в SubVI параметров, которые в ней не используются.
Единственный случай, когда имеет смысл этим все заморачиваться, это когда необходимо обрабатывать несколько больших многомерных массивов, например буфера. Особенно это актуально для классов. В этом случае в кластер собираются refы на эти массивы и копирование массива данных производится только в том месте, где это нужно, а другие массивы лежат себе потихоньку. В остальных случаях, сколько бы элементарных переменных в кластере ни было, вы никак не почувствуете выгоды от подобного рода извращений, ибо копирование данных производится в любом случае.
Кстати, если вы хотите еще немного выжать, то рекомендую строковые типы заменять байтовыми массивами. В отличие от строк, контролировать выделение памяти для массивов проще (например вставку в массив можно реализовать без перевыделения памяти, а вот со строкой такое не удастся)

Re: Наилучший способ передачи множества параметров в SubVI

Добавлено: 21 фев 2016, 19:29
dadreamer
Pavel писал(а):Когда то копались идай и ольгой но это было очень давно...
Если бы вы вспомнили, что делали для этого, было бы замечательно. А то я даже не знаю, где бряки ставить, чтоб такое выявить. А так, было бы интересно докопаться до истины. :)
Borjomy_1 писал(а):Но вообще-то, граждане, самым порочным в этом парадигме построения программы является передача в SubVI параметров, которые в ней не используются.
Довольно частая практика - передавать в функцию указатель на структуру. В нашем случае в роли функции - SubVI, в роли структуры - кластер, в роли указателя пусть будет DVR или Reference. По-моему, подход вполне в рамках традиций, пусть не для :labview: , а для программирования в целом.

upd:
Вот что нашёл: Frequently Asked Questions about SubVIs:
NI писал(а):Does LabVIEW make a new copy of data that is passed to a subVI?

If you pass data to multiple locations, all of which read the data without modifying it, LabVIEW does not make a copy of the data. Instead, LabVIEW simply hands each caller a reference to the existing data. To generate a copy of the data, use the Always Copy function.
На Лаве также пишут, что при правильной организации SubVI копий не создаётся:
ned писал(а):A properly-written subVI will not make a copy of data passed into it. You can use the "Show Buffer Allocations" tool to see this. In the subVI, all the front panel terminals should be at the top level (outside any loops and structures), and terminals should be marked required.