Работа с массивом

Простейшие вопросы в области инженерной разработки

Работа с массивом

Postby jane_wild on 27 Aug 2019, 17:53

Ребята возник вопрос, как модифицировать массив с наименьшими затратами в плане системных ресурсов? Имеется 2D массив, последний ряд которого это частота в герцах. Мне нужно заменить герцы на частоту вращения (RPM). Значит я удалила этот ряд, умножила на 60(сек) и снова добавила, типа так оно и было :)
Но мне кажется что это "затратный" способ, особенно когда массив достаточно большой (читала где то о копиях создаваемых LV, при манипуляциями с массивами). Порекомендуйте более оптимальное решение, если оно есть. Спасибо.
RPM.PNG
RPM.PNG (3.37 KiB) Viewed 1014 times
User avatar
jane_wild
advanced
advanced
 
Posts: 165
Joined: 30 Jun 2016, 02:11
LabVIEW Version: 2016
Karma: 8

Re: Работа с массивом

Postby Artem.spb on 27 Aug 2019, 17:57

удалять точно не надо
arr.png
arr.png (14.52 KiB) Viewed 1011 times

index->replace
Artem.spb
expert
expert
 
Posts: 1666
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 266
CLD hardware I/O VIP freelance

Re: Работа с массивом

Postby jane_wild on 27 Aug 2019, 18:42

Artem.spb, Спасибо, хотела спросить... А In Place Element Structure сюда никак не прикрутить? Слышала что эта структура решает проблему с копиями массивов. Но не пойму как ею воспользоваться. Там есть две функции работы с массивом, но первая выдает одиночный элемент, а вторая 2D массив...
In Place.png
In Place.png (5.54 KiB) Viewed 1007 times
User avatar
jane_wild
advanced
advanced
 
Posts: 165
Joined: 30 Jun 2016, 02:11
LabVIEW Version: 2016
Karma: 8

Re: Работа с массивом

Postby dadreamer on 27 Aug 2019, 19:41

jane_wild wrote:А In Place Element Structure сюда никак не прикрутить?

Можно, хотя это будет немного громоздко. Нужно использовать узел Array Split/Replace Subarray. По ПКМ на узле можно выбрать, по какому измерению разделять массив (строки или столбцы). По дефолту стоят строки (цифра "0" на узле). Дальше разделяем так, чтобы необходимая строка проходила по границе раздела, и потом снова разделяем с помощью ещё одной структуры таким же макаром. После можно сделать что-то с массивом и отправить обратно.
2019-08-27_21-29-04.jpg
2019-08-27_21-29-04.jpg (47.69 KiB) Viewed 1001 times

jane_wild wrote:Слышала что эта структура решает проблему с копиями массивов.

В данном случае копий получается больше, чем при использовании классических инструментов. Выгода от применения In Place здесь сомнительна. Думаю, бенчмарки, если их провести, покажут то же самое. upd: Беру свои слова обратно: viewtopic.php?p=81322#p81322
Last edited by dadreamer on 30 Aug 2019, 22:56, edited 1 time in total.
User avatar
dadreamer
professor
professor
 
Posts: 3336
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 845
I/O VIP vision internet

Re: Работа с массивом

Postby ujin on 28 Aug 2019, 15:39

удалять точно не надо

index->replace

Меньше по затратам времени вряд ли получится.
В этом варианте время выполнения совпадает с вызовом внешней библиотеки + разница в 1-2 мс на вызов функции dll:
void toRPM (double Param[][7],long ParamN)
{
for(long i = 0 ; i < ParamN; i++)
{
Param[i][6] *= 60;
}
}
Следовательно промежуточные массивы или не создаются или по затратам времени не видно.
ujin
beginner
beginner
 
Posts: 27
Joined: 28 Jul 2019, 13:16
LabVIEW Version: 15
Karma: 4

Re: Работа с массивом

Postby Artem.spb on 28 Aug 2019, 20:29

ujin wrote:Меньше по затратам времени вряд ли получится.
....
Следовательно промежуточные массивы или не создаются или по затратам времени не видно.

странная идея программировать на сторонних языках, программируя на :labview:
Я таким занимался в нулевых, когда надо было в слабый pxi запихать сложную математику. Пришлось её на сях сделать и dll вызывать. В остальном такие упражнения из разряда паранойи.

И в 20-30 раз это не быстрее?
arr2.png

Снимок.PNG
Снимок.PNG (3.48 KiB) Viewed 950 times
Artem.spb
expert
expert
 
Posts: 1666
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 266
CLD hardware I/O VIP freelance

Re: Работа с массивом

Postby ujin on 29 Aug 2019, 14:47

странная идея программировать на сторонних языках, программируя на

Я как раз об этом и говорил. Пример на С просто приведен как минимально возможный по времени. Следовательно Ваш вариант минимальный по затратам.
И в 20-30 раз это не быстрее?

А этот пример несколько некорректный. Удаление и создание массива в цикле (многократное).
В Vi Analyzer так и пишут:
Arrays and Strings in Loops This Build Array function is inside a For Loop. Every time a new value is appended to the array, LabVIEW must reallocate the memory buffer and copy the entire array to a new location. This can cause execution time to become slower with each loop iteration.
Плюс слегка некорректное расположение элементов в массиве значение RPM у Вас по строкам (т.е. подряд), а в вопросе по столбцам (каждый 7 элемент результирующего массива). В результате почему разные результаты 1 и 2 теста, хотя по логике должны быть одинаковые.
Attachments
test Arr.jpg
ujin
beginner
beginner
 
Posts: 27
Joined: 28 Jul 2019, 13:16
LabVIEW Version: 15
Karma: 4

Re: Работа с массивом

Postby taras_33 on 29 Aug 2019, 17:09

А In Place Element Structure сюда никак не прикрутить?

Ну почему же не прикрутить?
TestArray.png

Jane поиграйся с кейсами disable структуры, включая различные варианты и сравнивая результаты.
Мои выводы таковы: Тестировал на LV2016 разница между In Place и Replace Array минимальна, удаление а затем build проигрывает по скорости в 6-7 раз.
В LV2019 (наконец то контора раскошелилась :D ) In Place вне конкуренции на обработку 2D Array 7x1000000 она тратит 1 - 2 тика (mS)! Replace - 8 mS, ну и ожидаемо build array в аутсайдерах с 35 тиками.
Предполагаю что в более новых версиях LV были сделаны улучшения в функциях работы с массивами.
Attachments
TestArray.vi
(13.08 KiB) Downloaded 25 times
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
User avatar
taras_33
professional
professional
 
Posts: 304
Joined: 31 Oct 2009, 18:25
Medals: 1
Activity (1)
LabVIEW Version: 2019
Karma: 133
CLD VIP

Re: Работа с массивом

Postby ujin on 30 Aug 2019, 12:53

В остальном такие упражнения из разряда паранойи.

Многие функции в библиотеках от NI, как раз таки связанных с обработкой массивов, заканчиваются банальным вызовом dll.
Прошу прощения за оффтоп - это как обрезание это ничто и не обрезание ничто.
Attachments
Ni dll.jpg
ujin
beginner
beginner
 
Posts: 27
Joined: 28 Jul 2019, 13:16
LabVIEW Version: 15
Karma: 4

Re: Работа с массивом

Postby Artem.spb on 30 Aug 2019, 13:39

ujin wrote:
В остальном такие упражнения из разряда паранойи.

Многие функции в библиотеках от NI, как раз таки связанных с обработкой массивов, заканчиваются банальным вызовом dll.

Я как бы в курсе таких тонкостей, но это не повод переходить на ассемблерное программирование.

А этот пример несколько некорректный. Удаление и создание массива в цикле (многократное).

согласен, прохлопал эту ошибку. В корректном тесте разница всего в 2-3 раза

taras_33 wrote:Мои выводы таковы: Тестировал на LV2016 разница между In Place и Replace Array минимальна, удаление а затем build проигрывает по скорости в 6-7 раз.

Очень любопытно, как были получены такие цифры.
У меня на той же 2016 получилось 8-11-49
30% - вовсе не минимальная разница.
Но однократным тестам я не очень доверяю, поэтому теструю циклами. И в этом случае In Place капитально проигрывает, что выглядит очень странно
arr3.png

arr4.PNG
arr4.PNG (5.08 KiB) Viewed 869 times
Artem.spb
expert
expert
 
Posts: 1666
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 266
CLD hardware I/O VIP freelance

Re: Работа с массивом

Postby Artem.spb on 30 Aug 2019, 13:45

ujin wrote:
Снимок.PNG

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

Re: Работа с массивом

Postby jane_wild on 30 Aug 2019, 14:50

Jane поиграйся с кейсами disable структуры, включая различные варианты и сравнивая результаты

Спасибо очень познавательно. На моем компьютере с :labview: 2016 были следующие цифры 8-6-36 In Place Element structure проигывает Index Array + Replace...
Проверила у коллеги на :labview: 2018 результат 1-5-33 подтвердил выводы taras_33, In Place быстрее всех. Всем спасибо за участие.
User avatar
jane_wild
advanced
advanced
 
Posts: 165
Joined: 30 Jun 2016, 02:11
LabVIEW Version: 2016
Karma: 8

Re: Работа с массивом

Postby ujin on 30 Aug 2019, 18:39

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

Спасибо не обратил внимание, но результат не сильно поменялся.
Получается массив из семи строк по миллиону столбцов это не одно и тоже что миллион строк из семи столбцов.
Время обработки получилось разное.
Attachments
test Arr1.jpg
ujin
beginner
beginner
 
Posts: 27
Joined: 28 Jul 2019, 13:16
LabVIEW Version: 15
Karma: 4

Re: Работа с массивом

Postby Artem.spb on 30 Aug 2019, 19:29

ujin wrote:Получается массив из семи строк по миллиону столбцов это не одно и тоже что миллион строк из семи столбцов..

так и есть
вот одна из презентаций на тему оптимизации и тестирования
https://forums.ni.com/t5/2016-Advanced- ... anguage=en
Artem.spb
expert
expert
 
Posts: 1666
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 266
CLD hardware I/O VIP freelance

Re: Работа с массивом

Postby dadreamer on 30 Aug 2019, 22:56

taras_33 wrote:Мои выводы таковы: Тестировал на LV2016 разница между In Place и Replace Array минимальна, удаление а затем build проигрывает по скорости в 6-7 раз.

И правда, это даже меня немного удивило - несмотря на большое число копий In Place отлично справляется с заданием, даже лучше Replace. У меня получились вот такие результаты:
2019-08-31_0-06-58.jpg

В общем случае строка/столбец не обязаны находиться в начале или в конце массива, поэтому я заменил Build Array на Insert Into Array, и также вставил вторую In Place структуру внутрь первой. Вообще, использование Build для ≥2-мерных массивов ни разу не оправдано, т.к. IIA справляется с этим лучше: вот почему. Также не вижу смысла выполнять все варианты сразу в Sequence или, что того хуже, параллельно, т.к. это искусственно замедлит работу программы, а в итоге-то всё равно будет выбран один вариант, который будет исполняться не так часто, что в принципе равносильно однократному запуску теста. Разброс от запуска к запуску в пределах сотых мс. Рассмотрел также 4-й вариант - "грязный хак", как я его назвал - прямая запись в транспортный буфер (MoveBlock).
Результат: In Place и RAS примерно одинаково быстро отрабатывают, In Place чуть быстрее. IIA очень сильно остаёт от них, про BA я уж молчу. MoveBlock неплохо справляется, но явно не лучше RAS, хотя фактически это аналог In Place, но с доп. обёрткой в виде CLFN, что картину только ухудшает ( :labview: создаёт доп. копии параметров при передаче во внешний код). Больше тут особо добавить нечего, кроме пожалуй того, что любые массивы в :labview: хранятся линейно, байт за байтом. Именно поэтому на запись столбца уходит больше времени, чем на запись строки: строку можно записать блоком за одну операцию, тогда как для записи столбца приходится городить доп. цикл For и писать поэлементно. См. также How LabVIEW Stores Data in Memory.
Attachments
Arr Benc.vi
lv2015
(18.12 KiB) Downloaded 27 times
Arr Benc (4th option).vi
lv2017
+ "street magic"
(24.15 KiB) Downloaded 27 times
User avatar
dadreamer
professor
professor
 
Posts: 3336
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2019
Karma: 845
I/O VIP vision internet


Return to Для чайников

Who is online

Users browsing this forum: Yandex and 1 guest

cron