Работа с массивом
- jane_wild
- master
- Сообщения: 461
- Зарегистрирован: 30 июн 2016, 02:11
- Версия LabVIEW: 2020
- Благодарил (а): 84 раза
- Поблагодарили: 15 раз
- Контактная информация:
Работа с массивом
Ребята возник вопрос, как модифицировать массив с наименьшими затратами в плане системных ресурсов? Имеется 2D массив, последний ряд которого это частота в герцах. Мне нужно заменить герцы на частоту вращения (RPM). Значит я удалила этот ряд, умножила на 60(сек) и снова добавила, типа так оно и было :)
Но мне кажется что это "затратный" способ, особенно когда массив достаточно большой (читала где то о копиях создаваемых LV, при манипуляциями с массивами). Порекомендуйте более оптимальное решение, если оно есть. Спасибо.
Но мне кажется что это "затратный" способ, особенно когда массив достаточно большой (читала где то о копиях создаваемых LV, при манипуляциями с массивами). Порекомендуйте более оптимальное решение, если оно есть. Спасибо.
- jane_wild
- master
- Сообщения: 461
- Зарегистрирован: 30 июн 2016, 02:11
- Версия LabVIEW: 2020
- Благодарил (а): 84 раза
- Поблагодарили: 15 раз
- Контактная информация:
Re: Работа с массивом
Artem.spb, Спасибо, хотела спросить... А In Place Element Structure сюда никак не прикрутить? Слышала что эта структура решает проблему с копиями массивов. Но не пойму как ею воспользоваться. Там есть две функции работы с массивом, но первая выдает одиночный элемент, а вторая 2D массив...
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Работа с массивом
Можно, хотя это будет немного громоздко. Нужно использовать узел Array Split/Replace Subarray. По ПКМ на узле можно выбрать, по какому измерению разделять массив (строки или столбцы). По дефолту стоят строки (цифра "0" на узле). Дальше разделяем так, чтобы необходимая строка проходила по границе раздела, и потом снова разделяем с помощью ещё одной структуры таким же макаром. После можно сделать что-то с массивом и отправить обратно.jane_wild писал(а):А In Place Element Structure сюда никак не прикрутить?
В данном случае копий получается больше, чем при использовании классических инструментов. Выгода от применения In Place здесь сомнительна. Думаю, бенчмарки, если их провести, покажут то же самое. upd: Беру свои слова обратно: http://labviewportal.org/viewtopic.php?p=81322#p81322jane_wild писал(а):Слышала что эта структура решает проблему с копиями массивов.
Последний раз редактировалось dadreamer 30 авг 2019, 22:56, всего редактировалось 1 раз.
-
- user
- Сообщения: 94
- Зарегистрирован: 28 июл 2019, 13:16
- Версия LabVIEW: 19
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Работа с массивом
Меньше по затратам времени вряд ли получится.удалять точно не надо
index->replace
В этом варианте время выполнения совпадает с вызовом внешней библиотеки + разница в 1-2 мс на вызов функции dll:
void toRPM (double Param[][7],long ParamN)
{
for(long i = 0 ; i < ParamN; i++)
{
Param[6] *= 60;
}
}
Следовательно промежуточные массивы или не создаются или по затратам времени не видно.
-
- professor
- Сообщения: 3410
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Работа с массивом
странная идея программировать на сторонних языках, программируя наujin писал(а): Меньше по затратам времени вряд ли получится.
....
Следовательно промежуточные массивы или не создаются или по затратам времени не видно.
Я таким занимался в нулевых, когда надо было в слабый pxi запихать сложную математику. Пришлось её на сях сделать и dll вызывать. В остальном такие упражнения из разряда паранойи.
И в 20-30 раз это не быстрее?
-
- user
- Сообщения: 94
- Зарегистрирован: 28 июл 2019, 13:16
- Версия LabVIEW: 19
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Работа с массивом
Я как раз об этом и говорил. Пример на С просто приведен как минимально возможный по времени. Следовательно Ваш вариант минимальный по затратам.странная идея программировать на сторонних языках, программируя на
А этот пример несколько некорректный. Удаление и создание массива в цикле (многократное).И в 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 теста, хотя по логике должны быть одинаковые.
-
taras_33
- professional
- Сообщения: 392
- Зарегистрирован: 31 окт 2009, 18:25
- Награды: 1
- Версия LabVIEW: 2019
- Поблагодарили: 13 раз
- Контактная информация:
Re: Работа с массивом
Ну почему же не прикрутить? Jane поиграйся с кейсами disable структуры, включая различные варианты и сравнивая результаты.А In Place Element Structure сюда никак не прикрутить?
Мои выводы таковы: Тестировал на LV2016 разница между In Place и Replace Array минимальна, удаление а затем build проигрывает по скорости в 6-7 раз.
В LV2019 (наконец то контора раскошелилась ) In Place вне конкуренции на обработку 2D Array 7x1000000 она тратит 1 - 2 тика (mS)! Replace - 8 mS, ну и ожидаемо build array в аутсайдерах с 35 тиками.
Предполагаю что в более новых версиях LV были сделаны улучшения в функциях работы с массивами.
- Вложения
-
- TestArray.vi
- (13.08 КБ) 118 скачиваний
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!
So far, the Universe is winning!
-
- user
- Сообщения: 94
- Зарегистрирован: 28 июл 2019, 13:16
- Версия LabVIEW: 19
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Работа с массивом
Многие функции в библиотеках от NI, как раз таки связанных с обработкой массивов, заканчиваются банальным вызовом dll.В остальном такие упражнения из разряда паранойи.
Прошу прощения за оффтоп - это как обрезание это ничто и не обрезание ничто.
-
- professor
- Сообщения: 3410
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Работа с массивом
Я как бы в курсе таких тонкостей, но это не повод переходить на ассемблерное программирование.ujin писал(а):Многие функции в библиотеках от NI, как раз таки связанных с обработкой массивов, заканчиваются банальным вызовом dll.В остальном такие упражнения из разряда паранойи.
согласен, прохлопал эту ошибку. В корректном тесте разница всего в 2-3 разаА этот пример несколько некорректный. Удаление и создание массива в цикле (многократное).
Очень любопытно, как были получены такие цифры.taras_33 писал(а):Мои выводы таковы: Тестировал на LV2016 разница между In Place и Replace Array минимальна, удаление а затем build проигрывает по скорости в 6-7 раз.
У меня на той же 2016 получилось 8-11-49
30% - вовсе не минимальная разница.
Но однократным тестам я не очень доверяю, поэтому теструю циклами. И в этом случае In Place капитально проигрывает, что выглядит очень странно
-
- professor
- Сообщения: 3410
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Работа с массивом
В тесте есть некорректности, которые ставят результаты под сомнение.ujin писал(а):
1) Запись результатов в индикаторы идёт параллельно со следующим шагом теста, так что тест замедляется (в теории)
2) генерация второго массива идёт параллельно с первым шагом теста, что опять же может замедлить тест.
3) ну и про однократный тестя уже говорил, разброс может быть большим
- jane_wild
- master
- Сообщения: 461
- Зарегистрирован: 30 июн 2016, 02:11
- Версия LabVIEW: 2020
- Благодарил (а): 84 раза
- Поблагодарили: 15 раз
- Контактная информация:
Re: Работа с массивом
Спасибо очень познавательно. На моем компьютере с 2016 были следующие цифры 8-6-36 In Place Element structure проигывает Index Array + Replace...Jane поиграйся с кейсами disable структуры, включая различные варианты и сравнивая результаты
Проверила у коллеги на 2018 результат 1-5-33 подтвердил выводы taras_33, In Place быстрее всех. Всем спасибо за участие.
-
- user
- Сообщения: 94
- Зарегистрирован: 28 июл 2019, 13:16
- Версия LabVIEW: 19
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Работа с массивом
Спасибо не обратил внимание, но результат не сильно поменялся.В тесте есть некорректности, которые ставят результаты под сомнение.
Получается массив из семи строк по миллиону столбцов это не одно и тоже что миллион строк из семи столбцов.
Время обработки получилось разное.
-
- professor
- Сообщения: 3410
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Работа с массивом
так и естьujin писал(а):Получается массив из семи строк по миллиону столбцов это не одно и тоже что миллион строк из семи столбцов..
вот одна из презентаций на тему оптимизации и тестирования
https://forums.ni.com/t5/2016-Advanced- ... anguage=en
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Работа с массивом
И правда, это даже меня немного удивило - несмотря на большое число копий In Place отлично справляется с заданием, даже лучше Replace. У меня получились вот такие результаты: В общем случае строка/столбец не обязаны находиться в начале или в конце массива, поэтому я заменил Build Array на Insert Into Array, и также вставил вторую In Place структуру внутрь первой. Вообще, использование Build для ≥2-мерных массивов ни разу не оправдано, т.к. IIA справляется с этим лучше: вот почему. Также не вижу смысла выполнять все варианты сразу в Sequence или, что того хуже, параллельно, т.к. это искусственно замедлит работу программы, а в итоге-то всё равно будет выбран один вариант, который будет исполняться не так часто, что в принципе равносильно однократному запуску теста. Разброс от запуска к запуску в пределах сотых мс. Рассмотрел также 4-й вариант - "грязный хак", как я его назвал - прямая запись в транспортный буфер (MoveBlock).taras_33 писал(а):Мои выводы таковы: Тестировал на LV2016 разница между In Place и Replace Array минимальна, удаление а затем build проигрывает по скорости в 6-7 раз.
Результат: In Place и RAS примерно одинаково быстро отрабатывают, In Place чуть быстрее. IIA очень сильно остаёт от них, про BA я уж молчу. MoveBlock неплохо справляется, но явно не лучше RAS, хотя фактически это аналог In Place, но с доп. обёрткой в виде CLFN, что картину только ухудшает ( создаёт доп. копии параметров при передаче во внешний код). Больше тут особо добавить нечего, кроме пожалуй того, что любые массивы в хранятся линейно, байт за байтом. Именно поэтому на запись столбца уходит больше времени, чем на запись строки: строку можно записать блоком за одну операцию, тогда как для записи столбца приходится городить доп. цикл For и писать поэлементно. См. также How LabVIEW Stores Data in Memory.
- Вложения
-
- Arr Benc.vi
- lv2015
- (18.12 КБ) 105 скачиваний
-
- Arr Benc (4th option).vi
- lv2017
+ "street magic" - (24.15 КБ) 125 скачиваний
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 1 Ответы
- 502 Просмотры
-
Последнее сообщение alerm
-
- 16 Ответы
- 3265 Просмотры
-
Последнее сообщение Artem.spb
-
- 4 Ответы
- 224 Просмотры
-
Последнее сообщение Andrew Lunev