Страница 1 из 1

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

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

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

Добавлено: 27 авг 2019, 17:57
Artem.spb
удалять точно не надо
arr.png
arr.png (14.52 КБ) 3372 просмотра
index->replace

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

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

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

Добавлено: 27 авг 2019, 19:41
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 КБ) 3362 просмотра
jane_wild писал(а):Слышала что эта структура решает проблему с копиями массивов.
В данном случае копий получается больше, чем при использовании классических инструментов. Выгода от применения In Place здесь сомнительна. Думаю, бенчмарки, если их провести, покажут то же самое. upd: Беру свои слова обратно: http://labviewportal.org/viewtopic.php?p=81322#p81322

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

Добавлено: 28 авг 2019, 15:39
ujin
удалять точно не надо

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

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

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

И в 20-30 раз это не быстрее?
arr2.png
Снимок.PNG
Снимок.PNG (3.48 КБ) 3311 просмотров

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

Добавлено: 29 авг 2019, 14:47
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 теста, хотя по логике должны быть одинаковые.

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

Добавлено: 29 авг 2019, 17:09
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 были сделаны улучшения в функциях работы с массивами.

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

Добавлено: 30 авг 2019, 12:53
ujin
В остальном такие упражнения из разряда паранойи.
Многие функции в библиотеках от NI, как раз таки связанных с обработкой массивов, заканчиваются банальным вызовом dll.
Прошу прощения за оффтоп - это как обрезание это ничто и не обрезание ничто.

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

Добавлено: 30 авг 2019, 13:39
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 КБ) 3230 просмотров

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

Добавлено: 30 авг 2019, 13:45
Artem.spb
ujin писал(а):
Снимок.PNG
В тесте есть некорректности, которые ставят результаты под сомнение.
1) Запись результатов в индикаторы идёт параллельно со следующим шагом теста, так что тест замедляется (в теории)
2) генерация второго массива идёт параллельно с первым шагом теста, что опять же может замедлить тест.
3) ну и про однократный тестя уже говорил, разброс может быть большим

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

Добавлено: 30 авг 2019, 14:50
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 быстрее всех. Всем спасибо за участие.

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

Добавлено: 30 авг 2019, 18:39
ujin
В тесте есть некорректности, которые ставят результаты под сомнение.
Спасибо не обратил внимание, но результат не сильно поменялся.
Получается массив из семи строк по миллиону столбцов это не одно и тоже что миллион строк из семи столбцов.
Время обработки получилось разное.

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

Добавлено: 30 авг 2019, 19:29
Artem.spb
ujin писал(а):Получается массив из семи строк по миллиону столбцов это не одно и тоже что миллион строк из семи столбцов..
так и есть
вот одна из презентаций на тему оптимизации и тестирования
https://forums.ni.com/t5/2016-Advanced- ... anguage=en

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

Добавлено: 30 авг 2019, 22:56
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.