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

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

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

Postby dadreamer on 20 Jan 2016, 15:31

Pavel wrote:Кластер чем неудобен, так это тем что при передачи в субвиай делается его копия. В принципе для референсов это будет не критично, но если передавать весь кластер со всеми данными (допустим супер кластер) то при большом проекте копирование кластера будет отъедать место.

Если так, то с этим вряд ли что-то можно сделать. Если даже передавать в SubVI кластер по указателю/DVR, то внутри подприбора всё равно придётся его вытаскивать из области памяти и получится копия. В этом плане у текстовых языков опять же есть преимущество:
Code: Select all
void some_func(void *ptest_struct)
{
local_param = (test_struct *)ptest_struct->test_param;
}

Хотя, можно извернуться и скопировать только те параметры, что нужны в SubVI. Но придётся сделать много лишней работы наподобие MoveBlock и нужно знать, как данные лежат в памяти.
User avatar
dadreamer
professor
professor
 
Posts: 3150
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 801
I/O VIP vision internet

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

Postby Artem.spb on 20 Jan 2016, 16:03

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... структура, позволяющая обрабатывать элементы кластеров/массивов на месте.
Artem.spb
expert
expert
 
Posts: 1422
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 246
CLD hardware I/O VIP freelance

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

Postby Pavel on 20 Jan 2016, 17:41

dadreamer wrote:
Pavel wrote:Если так, то с этим вряд ли что-то можно сделать. Если даже передавать в SubVI кластер по указателю/DVR, то внутри подприбора всё равно придётся его вытаскивать из области памяти и получится копия. В этом плане у текстовых языков опять же есть преимущество:
Code: Select all
void some_func(void *ptest_struct)
{
local_param = (test_struct *)ptest_struct->test_param;
}

Хотя, можно извернуться и скопировать только те параметры, что нужны в SubVI. Но придётся сделать много лишней работы наподобие MoveBlock и нужно знать, как данные лежат в памяти.


Я это написал к тому что при использовании кластера нужно передавать не весь кластер а его часть-подкластер. Но я вижу этим вопросом ты владеешь лучше и глубже меня раз всплыли функции наподобие MoveBlock.

Artem.spb wrote:это утверждение даже звучит нелогично.
что же в таком случае происходит с оригинальными данными?


Звучит может и не логично, но тогда это было так. Может сейчас что-то поменялось! А вот что происходит со старыми данными в нутрях LV я уже честно и не помню.( Когда то копались идай и ольгой но это было очень давно...
Pavel
developer
developer
 
Posts: 271
Joined: 31 Jul 2009, 08:07
Medals: 1
Activity (1)
LabVIEW Version: 8.5
Karma: 39
VIP

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

Postby dadreamer on 20 Jan 2016, 18:17

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

Ну, это снова лишняя разборка-сборка в 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

Думаю, что да, несмотря на ухищрения.
User avatar
dadreamer
professor
professor
 
Posts: 3150
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 801
I/O VIP vision internet

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

Postby Artem.spb on 21 Jan 2016, 00:34

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

если так поступать, то естественно создаётся копия.

я всё же не увидел доказательств Вашего утверждения, что при сквозной передаче данных (судя по вашему утверждению не только кластера) через subvi порисходит копирование данных
Artem.spb
expert
expert
 
Posts: 1422
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 246
CLD hardware I/O VIP freelance

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

Postby Pavel on 22 Jan 2016, 07:55

Ну хороша, а какое тогда у Вас видение???
Pavel
developer
developer
 
Posts: 271
Joined: 31 Jul 2009, 08:07
Medals: 1
Activity (1)
LabVIEW Version: 8.5
Karma: 39
VIP

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

Postby Blackman on 22 Jan 2016, 08:52

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

Да это может происходить при определенных условиях в subVI.
Attachments
17 - Managing Performance and Memory.pdf
(614.32 KiB) Downloaded 105 times
Blackman
leader
leader
 
Posts: 798
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 234
VIP

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

Postby Artem.spb on 22 Jan 2016, 11:04

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

моё видение я уже писал со ссылкой на документ:
Artem.spb wrote: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 wrote:Да это может происходить при определенных условиях в subVI.
Вложения
17 - Managing Performance and Memory.pdf
(614.32 КБ) Скачиваний: 10

а точнее можно? читать 85 страниц для поиска определённых условий не хочется
Artem.spb
expert
expert
 
Posts: 1422
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 246
CLD hardware I/O VIP freelance

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

Postby Vitekkz88 on 22 Jan 2016, 11:08

Artem.spb писал(а): точнее можно? читать 85 страниц для поиска определённых условий не хочется

Солидарен!
Blackman, можно своими словами и по русски? Про определенные условия в subVI имеется ввиду.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
User avatar
Vitekkz88
expert
expert
 
Posts: 1047
Joined: 21 Jan 2014, 15:45
Location: Томск
Medals: 3
Activity (1) Silver (1) Автор (1)
LabVIEW Version: 12,13,14
Karma: 301
hardware I/O VIP

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

Postby Blackman on 22 Jan 2016, 19:22

страница 19 Conditional Indicators and Data Buffers
Blackman
leader
leader
 
Posts: 798
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 234
VIP

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

Postby Artem.spb on 22 Jan 2016, 19:33

Blackman wrote:страница 19 Conditional Indicators and Data Buffers


Это как раз НЕ является "сквозным проходом" данных через subVI. И не противоречит моему утверждению, что если вы передаёте блок данных в функцию, там меняете данные или используете их часть, после чего передаёте этот же кластер наружу.
Дополнительные индикаторы приводят к ветвлению проводников, что само собой приводит в дублированию данных.
но такие индикаторы если и и нужны, то только на этапе отладки, в конечной программе их логично убрать, если конечно subVI не является всплывающим окном.
Artem.spb
expert
expert
 
Posts: 1422
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 246
CLD hardware I/O VIP freelance

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

Postby Blackman on 22 Jan 2016, 19:59

Здесь нет речи о дополнительных индикаторах. А говорится об условии при котором происходит копирование данных: если выходной терминал (пусть будет кластер) расположен в Case structure или For Loop.
Blackman
leader
leader
 
Posts: 798
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 234
VIP

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

Postby Artem.spb on 22 Jan 2016, 20:26

В принципе можно согласиться, но если индикатор располагается в кейс-структуре, то это не является сквозным прохождением проводника.
Artem.spb
expert
expert
 
Posts: 1422
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 246
CLD hardware I/O VIP freelance

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

Postby Borjomy_1 on 22 Jan 2016, 23:13

Но вообще-то, граждане, самым порочным в этом парадигме построения программы является передача в SubVI параметров, которые в ней не используются.
Единственный случай, когда имеет смысл этим все заморачиваться, это когда необходимо обрабатывать несколько больших многомерных массивов, например буфера. Особенно это актуально для классов. В этом случае в кластер собираются refы на эти массивы и копирование массива данных производится только в том месте, где это нужно, а другие массивы лежат себе потихоньку. В остальных случаях, сколько бы элементарных переменных в кластере ни было, вы никак не почувствуете выгоды от подобного рода извращений, ибо копирование данных производится в любом случае.
Кстати, если вы хотите еще немного выжать, то рекомендую строковые типы заменять байтовыми массивами. В отличие от строк, контролировать выделение памяти для массивов проще (например вставку в массив можно реализовать без перевыделения памяти, а вот со строкой такое не удастся)
Borjomy_1
expert
expert
 
Posts: 1828
Joined: 28 Jun 2012, 09:32
Location: город семи холмов
Medals: 3
Activity (1) Professionalism (1) Silver (1)
LabVIEW Version: 4-8.6,9-14
Karma: 319
VIP

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

Postby dadreamer on 21 Feb 2016, 19:29

Pavel wrote:Когда то копались идай и ольгой но это было очень давно...

Если бы вы вспомнили, что делали для этого, было бы замечательно. А то я даже не знаю, где бряки ставить, чтоб такое выявить. А так, было бы интересно докопаться до истины. :)
Borjomy_1 wrote:Но вообще-то, граждане, самым порочным в этом парадигме построения программы является передача в SubVI параметров, которые в ней не используются.

Довольно частая практика - передавать в функцию указатель на структуру. В нашем случае в роли функции - SubVI, в роли структуры - кластер, в роли указателя пусть будет DVR или Reference. По-моему, подход вполне в рамках традиций, пусть не для :labview: , а для программирования в целом.

upd:
Вот что нашёл: Frequently Asked Questions about SubVIs:
NI wrote: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 wrote: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.
User avatar
dadreamer
professor
professor
 
Posts: 3150
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 801
I/O VIP vision internet

PreviousNext

Return to Лицевая панель

Who is online

Users browsing this forum: No registered users and 2 guests

cron