Производительность при использовании массивов

Простейшие вопросы в области инженерной разработки
maxim_MA
beginner
beginner
Сообщения: 15
Зарегистрирован: 16 авг 2022, 17:07
Версия LabVIEW: 2020
Благодарил (а): 1 раз
Контактная информация:

Производительность при использовании массивов

Сообщение maxim_MA »

Добрый день!
Давно заметил такую особенность, что при использовании 2D массивов или более падает производительность при выгрузке данных из цикла, особенно заметно при использовании больших массивов.
Вложения
test_1d_2d.png
Аватара пользователя
Juri
I/O
I/O
Сообщения: 263
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: Производительность при использовании массивов

Сообщение Juri »

Когда идет борьба за производительность нельзя использовать операции добавления в массив. Массив надо инициализировать заранее до цикла, а внутри цикла юзать операции замены элемента массива
maxim_MA
beginner
beginner
Сообщения: 15
Зарегистрирован: 16 авг 2022, 17:07
Версия LabVIEW: 2020
Благодарил (а): 1 раз
Контактная информация:

Re: Производительность при использовании массивов

Сообщение maxim_MA »

Разве for loop не создает массив и потом производит операции по замене значений ? количеством итераций как раз и определяется размер массива на выходе и заранее выделяется память под эти данные или я не правильно понимаю?
Artem.spb

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

Re: Производительность при использовании массивов

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

Если я не ошибся в расчётах, у вас там гигабайт банных. Что вас удивляет?
Аватара пользователя
dadreamer

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

Re: Производительность при использовании массивов

Сообщение dadreamer »

maxim_MA писал(а): 11 май 2023, 16:10Разве for loop не создает массив и потом производит операции по замене значений ? количеством итераций как раз и определяется размер массива на выходе и заранее выделяется память под эти данные или я не правильно понимаю?
Вообще, да, массив в этом случае выделяется перед циклом. Только выделяется он изначально пустым (с нулевой длиной). А дальше :labview: его динамически расширяет на каждой итерации. Конечно, на это требуется время. Массивы в :labview: занимают непрерывную область памяти. Если текущий блок памяти нельзя расширить, не попав на следующие данные, то, очевидно, понадобится выделение нового блока и копирование. Для For Loop с подключенным терминалом итераций массив выделяется перед циклом и имеет заранее определённый размер. Причина различий в работе 1D/2D в другом. Также какое-то время тратится на обновление размера массива, для одномерного массива это одно поле Int32, для двухмерного два поля (см. How LabVIEW Stores Data in Memory, п. Arrays).
Последний раз редактировалось dadreamer 16 май 2023, 11:29, всего редактировалось 1 раз.
maxim_MA
beginner
beginner
Сообщения: 15
Зарегистрирован: 16 авг 2022, 17:07
Версия LabVIEW: 2020
Благодарил (а): 1 раз
Контактная информация:

Re: Производительность при использовании массивов

Сообщение maxim_MA »

dadreamer писал(а): 11 май 2023, 17:38 Вообще, да, массив в этом случае выделяется перед циклом. Только выделяется он изначально пустым (с нулевой длиной). А дальше его динамически расширяет на каждой итерации. Конечно, на это требуется время. Массивы в занимают непрерывную область памяти. Если текущий блок памяти нельзя расширить, не попав на следующие данные, то, очевидно, понадобится выделение нового блока и копирование. Также какое-то время тратится на обновление размера массива, для одномерного массива это одно поле Int32, для двухмерного два поля (см. How LabVIEW Stores Data in Memory, п. Arrays).
Спасибо за развернутый ответ! буду учитывать в дальнейшем.
Аватара пользователя
alerm

Activity
leader
leader
Сообщения: 683
Зарегистрирован: 02 май 2012, 21:28
Награды: 1
Версия LabVIEW: 20
Благодарил (а): 59 раз
Поблагодарили: 9 раз
Контактная информация:

Re: Производительность при использовании массивов

Сообщение alerm »

dadreamer писал(а): 11 май 2023, 17:38 Массивы в :labview: занимают непрерывную область памяти.
Мне помнится, что массивы таким грешат во всех языках. Или я путаю?
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Производительность при использовании массивов

Сообщение Borjomy_1 »

Заявление о создании пустого массива и добавления в него - сомнительное. По моему опыту если Labview имеет данные о размере массива (количество циклов For и фиксированный размер элемента), то необходимый объем выделяется СРАЗУ.
Но! В вашем случае используется опция "concatinate" именно она и является причиной торможения. Попробуйте использовать автоиндексацию, а потом ReShape для приведения к нужной размерности
Artem.spb

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

Re: Производительность при использовании массивов

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

dadreamer писал(а): 11 май 2023, 17:38 Вообще, да, массив в этом случае выделяется перед циклом. Только выделяется он изначально пустым (с нулевой длиной). А дальше :labview: его динамически расширяет на каждой итерации. Конечно, на это требуется время.
В очередной раз озадачился, почему в древних талмудах говорилось, что использовать индексацию в while loop это атата, а вот в for - самое то? Раньше было не так, массив выделялся сразу весь?
И до сих пор while по умолчанию индексация выключена, а for включена.
Artem.spb

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

Re: Производительность при использовании массивов

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

alerm писал(а): 11 май 2023, 20:04
dadreamer писал(а): 11 май 2023, 17:38 Массивы в :labview: занимают непрерывную область памяти.
Мне помнится, что массивы таким грешат во всех языках. Или я путаю?
Было бы странно фрагментировать области памяти :)
Artem.spb

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

Re: Производительность при использовании массивов

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

Borjomy_1 писал(а): 11 май 2023, 20:12 Заявление о создании пустого массива и добавления в него - сомнительное. По моему опыту если Labview имеет данные о размере массива (количество циклов For и фиксированный размер элемента), то необходимый объем выделяется СРАЗУ.
По моему опыту в последних версиях разницы как раз нет. Я не смог получить ускорение в генераторах при использовании for/while

upd.
Скорость отличается в 4 раза. Мир перевернулся обратно :)
loops.PNG
Аватара пользователя
alerm

Activity
leader
leader
Сообщения: 683
Зарегистрирован: 02 май 2012, 21:28
Награды: 1
Версия LabVIEW: 20
Благодарил (а): 59 раз
Поблагодарили: 9 раз
Контактная информация:

Re: Производительность при использовании массивов

Сообщение alerm »

Artem.spb писал(а): 11 май 2023, 20:51 Было бы странно фрагментировать области памяти :)
А кластер разве делает не так? Блин, я реально уже не помню, может мне это почудилось :D
Artem.spb

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

Re: Производительность при использовании массивов

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

alerm писал(а): 11 май 2023, 21:07
Artem.spb писал(а): 11 май 2023, 20:51 Было бы странно фрагментировать области памяти :)
А кластер разве делает не так? Блин, я реально уже не помню, может мне это почудилось :D
Не совсем так.
Все простые элементы лежат пачкой, а составные (массивы всякие) в кластере лежат ссылкой, а ссылка уже куда попало указывает.
Так что для массива утверждение о фрагментации верное, а для всего остального - нет :)
Artem.spb

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

Re: Производительность при использовании массивов

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

Добавил ещё один тип for
В общем, если размер известен, заранее выделять не обязательно :)
loops2.PNG
Аватара пользователя
dadreamer

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

Re: Производительность при использовании массивов

Сообщение dadreamer »

alerm писал(а): 11 май 2023, 20:04
dadreamer писал(а): 11 май 2023, 17:38 Массивы в :labview: занимают непрерывную область памяти.
Мне помнится, что массивы таким грешат во всех языках. Или я путаю?
Кстати, хорошо подмечено, зря я акцент на :labview: поставил. В большинстве языков, по крайней мере в C/C++, под массив выделяется непрерывная область в виртуальной памяти. В физической это может вполне соответствовать разным областям, но программиста обычно это не должно беспокоить. Хотя в некоторых языках можно выделять и НЕ-непрерывный массив, скажем, в Python или Swift. Но я там не эксперт, так что не скажу, обычное ли это явление или надо как-то специально это делать.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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