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

Простейшие вопросы в области инженерной разработки
Ответить
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

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

Сообщение jane_wild »

Ребята возник вопрос, как модифицировать массив с наименьшими затратами в плане системных ресурсов? Имеется 2D массив, последний ряд которого это частота в герцах. Мне нужно заменить герцы на частоту вращения (RPM). Значит я удалила этот ряд, умножила на 60(сек) и снова добавила, типа так оно и было :)
Но мне кажется что это "затратный" способ, особенно когда массив достаточно большой (читала где то о копиях создаваемых LV, при манипуляциями с массивами). Порекомендуйте более оптимальное решение, если оно есть. Спасибо.
RPM.PNG
RPM.PNG (3.37 КБ) 3378 просмотров
Artem.spb

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

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

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

удалять точно не надо
arr.png
arr.png (14.52 КБ) 3375 просмотров
index->replace
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

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

Сообщение jane_wild »

Artem.spb, Спасибо, хотела спросить... А In Place Element Structure сюда никак не прикрутить? Слышала что эта структура решает проблему с копиями массивов. Но не пойму как ею воспользоваться. Там есть две функции работы с массивом, но первая выдает одиночный элемент, а вторая 2D массив...
In Place.png
In Place.png (5.54 КБ) 3371 просмотр
Аватара пользователя
dadreamer

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

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

Сообщение dadreamer »

jane_wild писал(а):А 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 КБ) 3365 просмотров
jane_wild писал(а):Слышала что эта структура решает проблему с копиями массивов.
В данном случае копий получается больше, чем при использовании классических инструментов. Выгода от применения In Place здесь сомнительна. Думаю, бенчмарки, если их провести, покажут то же самое. upd: Беру свои слова обратно: http://labviewportal.org/viewtopic.php?p=81322#p81322
Последний раз редактировалось dadreamer 30 авг 2019, 22:56, всего редактировалось 1 раз.
ujin
user
user
Сообщения: 94
Зарегистрирован: 28 июл 2019, 13:16
Версия LabVIEW: 19
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

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

Сообщение ujin »

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

index->replace
Меньше по затратам времени вряд ли получится.
В этом варианте время выполнения совпадает с вызовом внешней библиотеки + разница в 1-2 мс на вызов функции dll:
void toRPM (double Param[][7],long ParamN)
{
for(long i = 0 ; i < ParamN; i++)
{
Param[6] *= 60;
}
}
Следовательно промежуточные массивы или не создаются или по затратам времени не видно.
Artem.spb

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

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

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

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

И в 20-30 раз это не быстрее?
arr2.png
Снимок.PNG
Снимок.PNG (3.48 КБ) 3314 просмотров
ujin
user
user
Сообщения: 94
Зарегистрирован: 28 июл 2019, 13:16
Версия LabVIEW: 19
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

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

Сообщение ujin »

странная идея программировать на сторонних языках, программируя на
Я как раз об этом и говорил. Пример на С просто приведен как минимально возможный по времени. Следовательно Ваш вариант минимальный по затратам.
И в 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 теста, хотя по логике должны быть одинаковые.
Вложения
test Arr.jpg
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 391
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 13 раз
Контактная информация:

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

Сообщение taras_33 »

А 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 были сделаны улучшения в функциях работы с массивами.
Вложения
TestArray.vi
(13.08 КБ) 116 скачиваний
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!
ujin
user
user
Сообщения: 94
Зарегистрирован: 28 июл 2019, 13:16
Версия LabVIEW: 19
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

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

Сообщение ujin »

В остальном такие упражнения из разряда паранойи.
Многие функции в библиотеках от NI, как раз таки связанных с обработкой массивов, заканчиваются банальным вызовом dll.
Прошу прощения за оффтоп - это как обрезание это ничто и не обрезание ничто.
Вложения
Ni dll.jpg
Artem.spb

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

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

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

ujin писал(а):
В остальном такие упражнения из разряда паранойи.
Многие функции в библиотеках от NI, как раз таки связанных с обработкой массивов, заканчиваются банальным вызовом dll.
Я как бы в курсе таких тонкостей, но это не повод переходить на ассемблерное программирование.
А этот пример несколько некорректный. Удаление и создание массива в цикле (многократное).
согласен, прохлопал эту ошибку. В корректном тесте разница всего в 2-3 раза
taras_33 писал(а):Мои выводы таковы: Тестировал на LV2016 разница между In Place и Replace Array минимальна, удаление а затем build проигрывает по скорости в 6-7 раз.
Очень любопытно, как были получены такие цифры.
У меня на той же 2016 получилось 8-11-49
30% - вовсе не минимальная разница.
Но однократным тестам я не очень доверяю, поэтому теструю циклами. И в этом случае In Place капитально проигрывает, что выглядит очень странно
arr3.png
arr4.PNG
arr4.PNG (5.08 КБ) 3233 просмотра
Artem.spb

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

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

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

ujin писал(а):
Снимок.PNG
В тесте есть некорректности, которые ставят результаты под сомнение.
1) Запись результатов в индикаторы идёт параллельно со следующим шагом теста, так что тест замедляется (в теории)
2) генерация второго массива идёт параллельно с первым шагом теста, что опять же может замедлить тест.
3) ну и про однократный тестя уже говорил, разброс может быть большим
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

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

Сообщение jane_wild »

Jane поиграйся с кейсами disable структуры, включая различные варианты и сравнивая результаты
Спасибо очень познавательно. На моем компьютере с :labview: 2016 были следующие цифры 8-6-36 In Place Element structure проигывает Index Array + Replace...
Проверила у коллеги на :labview: 2018 результат 1-5-33 подтвердил выводы taras_33, In Place быстрее всех. Всем спасибо за участие.
ujin
user
user
Сообщения: 94
Зарегистрирован: 28 июл 2019, 13:16
Версия LabVIEW: 19
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

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

Сообщение ujin »

В тесте есть некорректности, которые ставят результаты под сомнение.
Спасибо не обратил внимание, но результат не сильно поменялся.
Получается массив из семи строк по миллиону столбцов это не одно и тоже что миллион строк из семи столбцов.
Время обработки получилось разное.
Вложения
test Arr1.jpg
Artem.spb

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

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

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

ujin писал(а):Получается массив из семи строк по миллиону столбцов это не одно и тоже что миллион строк из семи столбцов..
так и есть
вот одна из презентаций на тему оптимизации и тестирования
https://forums.ni.com/t5/2016-Advanced- ... anguage=en
Аватара пользователя
dadreamer

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

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

Сообщение dadreamer »

taras_33 писал(а):Мои выводы таковы: Тестировал на 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.
Вложения
Arr Benc.vi
lv2015
(18.12 КБ) 103 скачивания
Arr Benc (4th option).vi
lv2017
+ "street magic"
(24.15 КБ) 123 скачивания
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»