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

Обсуждение, связанное с разработкой ПО верхнего уровня
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

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

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

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

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

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

Сообщение 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... структура, позволяющая обрабатывать элементы кластеров/массивов на месте.
Pavel

Activity
developer
developer
Сообщения: 271
Зарегистрирован: 31 июл 2009, 08:07
Награды: 1
Версия LabVIEW: 8.5

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

Сообщение 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 я уже честно и не помню.( Когда то копались идай и ольгой но это было очень давно...
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение 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
Думаю, что да, несмотря на ухищрения.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

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

Сообщение Artem.spb »

Pavel писал(а):Я это написал к тому что при использовании кластера нужно передавать не весь кластер а его часть-подкластер.
если так поступать, то естественно создаётся копия.

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

Activity
developer
developer
Сообщения: 271
Зарегистрирован: 31 июл 2009, 08:07
Награды: 1
Версия LabVIEW: 8.5

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

Сообщение Pavel »

Ну хороша, а какое тогда у Вас видение???
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

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

Сообщение Blackman »

я всё же не увидел доказательств Вашего утверждения, что при сквозной передаче данных (судя по вашему утверждению не только кластера) через subvi происходит копирование данных
Да это может происходить при определенных условиях в subVI.
Вложения
17 - Managing Performance and Memory.pdf
(614.32 КБ) 203 скачивания
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

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

Сообщение 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 страниц для поиска определённых условий не хочется
Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

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

Сообщение Vitekkz88 »

Artem.spb писал(а): точнее можно? читать 85 страниц для поиска определённых условий не хочется
Солидарен!
Blackman, можно своими словами и по русски? Про определенные условия в subVI имеется ввиду.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

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

Сообщение Blackman »

страница 19 Conditional Indicators and Data Buffers
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

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

Сообщение Artem.spb »

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

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

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

Сообщение Blackman »

Здесь нет речи о дополнительных индикаторах. А говорится об условии при котором происходит копирование данных: если выходной терминал (пусть будет кластер) расположен в Case structure или For Loop.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

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

Сообщение Artem.spb »

В принципе можно согласиться, но если индикатор располагается в кейс-структуре, то это не является сквозным прохождением проводника.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

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

Сообщение Borjomy_1 »

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

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение 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.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Лицевая панель»