Производительность при использовании массивов
-
- beginner
- Сообщения: 15
- Зарегистрирован: 16 авг 2022, 17:07
- Версия LabVIEW: 2020
- Благодарил (а): 1 раз
- Контактная информация:
Производительность при использовании массивов
Добрый день!
Давно заметил такую особенность, что при использовании 2D массивов или более падает производительность при выгрузке данных из цикла, особенно заметно при использовании больших массивов.
Давно заметил такую особенность, что при использовании 2D массивов или более падает производительность при выгрузке данных из цикла, особенно заметно при использовании больших массивов.
- Juri
- I/O
- Сообщения: 263
- Зарегистрирован: 19 апр 2017, 23:06
- Версия LabVIEW: 2021
- Благодарил (а): 13 раз
- Поблагодарили: 6 раз
Re: Производительность при использовании массивов
Когда идет борьба за производительность нельзя использовать операции добавления в массив. Массив надо инициализировать заранее до цикла, а внутри цикла юзать операции замены элемента массива
-
- beginner
- Сообщения: 15
- Зарегистрирован: 16 авг 2022, 17:07
- Версия LabVIEW: 2020
- Благодарил (а): 1 раз
- Контактная информация:
Re: Производительность при использовании массивов
Разве for loop не создает массив и потом производит операции по замене значений ? количеством итераций как раз и определяется размер массива на выходе и заранее выделяется память под эти данные или я не правильно понимаю?
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Производительность при использовании массивов
Если я не ошибся в расчётах, у вас там гигабайт банных. Что вас удивляет?
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Производительность при использовании массивов
Вообще, да, массив в этом случае выделяется перед циклом. Только выделяется он изначально пустым (с нулевой длиной). А дальше его динамически расширяет на каждой итерации. Конечно, на это требуется время. Массивы в занимают непрерывную область памяти. Если текущий блок памяти нельзя расширить, не попав на следующие данные, то, очевидно, понадобится выделение нового блока и копирование. Для For Loop с подключенным терминалом итераций массив выделяется перед циклом и имеет заранее определённый размер. Причина различий в работе 1D/2D в другом. Также какое-то время тратится на обновление размера массива, для одномерного массива это одно поле Int32, для двухмерного два поля (см. How LabVIEW Stores Data in Memory, п. Arrays).
Последний раз редактировалось dadreamer 16 май 2023, 11:29, всего редактировалось 1 раз.
-
- beginner
- Сообщения: 15
- Зарегистрирован: 16 авг 2022, 17:07
- Версия LabVIEW: 2020
- Благодарил (а): 1 раз
- Контактная информация:
Re: Производительность при использовании массивов
Спасибо за развернутый ответ! буду учитывать в дальнейшем.dadreamer писал(а): ↑11 май 2023, 17:38 Вообще, да, массив в этом случае выделяется перед циклом. Только выделяется он изначально пустым (с нулевой длиной). А дальше его динамически расширяет на каждой итерации. Конечно, на это требуется время. Массивы в занимают непрерывную область памяти. Если текущий блок памяти нельзя расширить, не попав на следующие данные, то, очевидно, понадобится выделение нового блока и копирование. Также какое-то время тратится на обновление размера массива, для одномерного массива это одно поле Int32, для двухмерного два поля (см. How LabVIEW Stores Data in Memory, п. Arrays).
-
alerm
- leader
- Сообщения: 683
- Зарегистрирован: 02 май 2012, 21:28
- Награды: 1
- Версия LabVIEW: 20
- Благодарил (а): 59 раз
- Поблагодарили: 9 раз
- Контактная информация:
Re: Производительность при использовании массивов
Мне помнится, что массивы таким грешат во всех языках. Или я путаю?
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Производительность при использовании массивов
Заявление о создании пустого массива и добавления в него - сомнительное. По моему опыту если Labview имеет данные о размере массива (количество циклов For и фиксированный размер элемента), то необходимый объем выделяется СРАЗУ.
Но! В вашем случае используется опция "concatinate" именно она и является причиной торможения. Попробуйте использовать автоиндексацию, а потом ReShape для приведения к нужной размерности
Но! В вашем случае используется опция "concatinate" именно она и является причиной торможения. Попробуйте использовать автоиндексацию, а потом ReShape для приведения к нужной размерности
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Производительность при использовании массивов
В очередной раз озадачился, почему в древних талмудах говорилось, что использовать индексацию в while loop это атата, а вот в for - самое то? Раньше было не так, массив выделялся сразу весь?dadreamer писал(а): ↑11 май 2023, 17:38 Вообще, да, массив в этом случае выделяется перед циклом. Только выделяется он изначально пустым (с нулевой длиной). А дальше его динамически расширяет на каждой итерации. Конечно, на это требуется время.
И до сих пор while по умолчанию индексация выключена, а for включена.
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Производительность при использовании массивов
По моему опыту в последних версиях разницы как раз нет. Я не смог получить ускорение в генераторах при использовании for/while
upd.
Скорость отличается в 4 раза. Мир перевернулся обратно
-
alerm
- leader
- Сообщения: 683
- Зарегистрирован: 02 май 2012, 21:28
- Награды: 1
- Версия LabVIEW: 20
- Благодарил (а): 59 раз
- Поблагодарили: 9 раз
- Контактная информация:
Re: Производительность при использовании массивов
А кластер разве делает не так? Блин, я реально уже не помню, может мне это почудилось
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Производительность при использовании массивов
Не совсем так.
Все простые элементы лежат пачкой, а составные (массивы всякие) в кластере лежат ссылкой, а ссылка уже куда попало указывает.
Так что для массива утверждение о фрагментации верное, а для всего остального - нет
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Производительность при использовании массивов
Добавил ещё один тип for
В общем, если размер известен, заранее выделять не обязательно
В общем, если размер известен, заранее выделять не обязательно
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Производительность при использовании массивов
Кстати, хорошо подмечено, зря я акцент на поставил. В большинстве языков, по крайней мере в C/C++, под массив выделяется непрерывная область в виртуальной памяти. В физической это может вполне соответствовать разным областям, но программиста обычно это не должно беспокоить. Хотя в некоторых языках можно выделять и НЕ-непрерывный массив, скажем, в Python или Swift. Но я там не эксперт, так что не скажу, обычное ли это явление или надо как-то специально это делать.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 6 Ответы
- 1645 Просмотры
-
Последнее сообщение ladik
-
- 38 Ответы
- 13305 Просмотры
-
Последнее сообщение AndreyDmitriev
-
- 2 Ответы
- 271 Просмотры
-
Последнее сообщение Optoelectronics
-
- 4 Ответы
- 1670 Просмотры
-
Последнее сообщение Borjomy_1
-
- 7 Ответы
- 248 Просмотры
-
Последнее сообщение Zloydj