Дорабатываю тест, чтобы он был больше приближен к реальности (описал пару постов ранее). Не могу понять, откуда в вашем варианте брать выборку
Ползущий массив (сравнение скоростей)
-
- 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: Ползущий массив (сравнение скоростей)
Добавил Build+subset и в каждом прогоне из буфера извлекаю последние 1000 значений (как бы на графике отображаю).
in place вообще никак не повлияло на результаты. кривые полностью совпадают, поэтому отключил их
Build+subset идёт по центру (фиолетовая), в остальном результаты прежние - быстрее всего вращать массив, или удалять нулевой и прибавлять в конец новый.
in place вообще никак не повлияло на результаты. кривые полностью совпадают, поэтому отключил их
Build+subset идёт по центру (фиолетовая), в остальном результаты прежние - быстрее всего вращать массив, или удалять нулевой и прибавлять в конец новый.
-
- leader
- Сообщения: 526
- Зарегистрирован: 28 фев 2010, 18:04
- Версия LabVIEW: LV2018
- Благодарил (а): 10 раз
- Поблагодарили: 18 раз
- Контактная информация:
Re: Ползущий массив (сравнение скоростей)
Я не зря оговорился о том для чего нужен такой ползущий массив. Вот, например, оперативное преобразование фурье для одной гармоники. Традиционно надо бы как раз такой массив и использовать. Но вот оптимизированный рабочий вариант, в котором используется упомянутое мной заполнение массива. В этой трактовке его тоже можно назвать ползущим. А что касается в выборке из массива нужной части, то по отношению к моему вариану это вопрос только индексации.
- Вложения
-
- СкользящееФП.vi
- (42.28 КБ) 60 скачиваний
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Ползущий массив (сравнение скоростей)
В моём понимании это и есть кольцевой буфер.
Вы можете привести "простой" пример выборки из него произвольного фрагмента? Например, когда начало фрагмента в конце массива, а его хвост в начале.
Меня смущает только заморочность этой части, в остальном "всё прекрасно"
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Ползущий массив (сравнение скоростей)
Сдвиговые регистры:
Буфер in - основной циклический буфер
Буфер out - текущая выборка
-
- adviser
- Сообщения: 231
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 18 раз
- Поблагодарили: 37 раз
- Контактная информация:
Re: Ползущий массив (сравнение скоростей)
Указатель начала занимаемой области памяти, размер занимаемой области памяти, указатель начала массива, указатель конца массива (в пределах занимаемой области)Artem.spb писал(а): ↑08 дек 2021, 20:07 Прогноз: проворачивать массив - одно из самых долгих дел. Тут или поэлементное копирование, или выделение нового буфера и перенос туда.
Split array должен работать быстро, потому что массивы можно оставить на месте, просто добавить ещё одну ссылку (на вторую часть).
Для проворота достаточно изменить указатели начала и конца массива. И не запутаться с переносом из начального в конечный адрес или наоборот.
На ассемблере когда программировал так делал. Это к тому, что копировать необязательно.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Ползущий массив (сравнение скоростей)
Недостаточно. Потому что используется все равно копия. И массивы простых типов хранятся в памяти последовательно, без указателей на каждый элемент массива.ujin1 писал(а): ↑10 дек 2021, 09:08Указатель начала занимаемой области памяти, размер занимаемой области памяти, указатель начала массива, указатель конца массива (в пределах занимаемой области)Artem.spb писал(а): ↑08 дек 2021, 20:07 Прогноз: проворачивать массив - одно из самых долгих дел. Тут или поэлементное копирование, или выделение нового буфера и перенос туда.
Split array должен работать быстро, потому что массивы можно оставить на месте, просто добавить ещё одну ссылку (на вторую часть).
Для проворота достаточно изменить указатели начала и конца массива. И не запутаться с переносом из начального в конечный адрес или наоборот.
На ассемблере когда программировал так делал. Это к тому, что копировать необязательно.
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Ползущий массив (сравнение скоростей)
Зачем указатель на конец?
начало, размер (тип) элемента, длина массива (В штуках).
При разбивке на два, я бы в исходном поменял длину, второму назначил новый указатель с середины исходного. Копировать ничего не нужно.
-
Chupakabra
- professional
- Сообщения: 360
- Зарегистрирован: 21 янв 2009, 10:50
- Награды: 1
- Версия LabVIEW: 2015
- Откуда: Москва
- Поблагодарили: 4 раза
- Контактная информация:
Re: Ползущий массив (сравнение скоростей)
Есть еще такая штука In-Memory SQLite. По скорости ничего не скажу, нужно пробовать. Но можно временные ряды хранить в памяти и извлекать со всеми плюшками sql.Artem.spb писал(а): ↑09 дек 2021, 15:42 Конкретизирую задачу.
Массив - это буфер, который копит историю значений за несколько часов. И при каждом добавлении элемента из буфера надо взять фрагмент неопределённой длины и из неопределённого места. Сколько и откуда - зависит от того, что просматривает пользователь. Может пару минут в самом конце смотрит, а может весь график. Поэтому очереди при видимом удобстве не подходят - придётся извлекать весь массив и брать из него фрагмент.
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Ползущий массив (сравнение скоростей)
Крайне странная, но интересная идея. Я In-Memory использовал для быстрых нестандартных поисков, а вот для буферов - идея не возникала.Chupakabra писал(а): ↑10 дек 2021, 15:27 Есть еще такая штука In-Memory SQLite. По скорости ничего не скажу, нужно пробовать. Но можно временные ряды хранить в памяти и извлекать со всеми плюшками sql.
-
- leader
- Сообщения: 526
- Зарегистрирован: 28 фев 2010, 18:04
- Версия LabVIEW: LV2018
- Благодарил (а): 10 раз
- Поблагодарили: 18 раз
- Контактная информация:
Re: Ползущий массив (сравнение скоростей)
Нет, не могу. Но сдаётся, что в конечном итоге некий выигрыш может быть, поскольку такая ситуация
не каждый же раз возникает. Если быстродействие желательно иметь максимальным, а двойной размер массива приемлем, то возможен такой вариант: И здесь в полной мере видна истина: "Выигрываеш в быстродействии - проигрываеш в памяти и наоборот".
- Вложения
-
- Индексация.vi
- (14.83 КБ) 50 скачиваний
-
- ДвойнойМассив.vi
- (10.21 КБ) 50 скачиваний
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Ползущий массив (сравнение скоростей)
леньChupakabra писал(а): ↑10 дек 2021, 15:27 Есть еще такая штука In-Memory SQLite. По скорости ничего не скажу, нужно пробовать. Но можно временные ряды хранить в памяти и извлекать со всеми плюшками sql.
начал было делать, и почти сразу "да ну нафиг". Во-первых, надо отслеживать индексы в самой базе. Тут, конечно, может быть упрощение в случае поиска по времени, а не просто по индексам.
Дальше, работа со строками "where id = %d" - явно не самые быстрые операции, так что даже не стал заморачиваться
-
- professor
- Сообщения: 3407
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Ползущий массив (сравнение скоростей)
Встроил в тестирование, но всё же выделение массива оставил, т.к. предполагается постоянное копирование выборки на график.
А вот это оказалось фантастически привлекательной идеей.
Итак, третий раунд тестирования, in place убрал, потому что толку от него никакого, только в предпоследний метод добавил, но в данном случае стало только хуже (самая верхняя кривая).
Вообще, этот кольцевой буфер оказался самым неудачным вариантом. Подозреваю, из-за поэлементного копирования.
А вот двойной перерасход памяти дал просто фантастическую скорость работы.
-
- adviser
- Сообщения: 231
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 18 раз
- Поблагодарили: 37 раз
- Контактная информация:
Re: Ползущий массив (сравнение скоростей)
На ассемблере так было удобней. Да и тип был только один - int8.
-
- adviser
- Сообщения: 231
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 18 раз
- Поблагодарили: 37 раз
- Контактная информация:
Re: Ползущий массив (сравнение скоростей)
Гениально.
Делал график. Начальная загрузка с базы данных значений за выбранный период (обычно час) чтобы сразу история появлялась. А далее подгрузка недостающих значений с этой же базы. Теперь таких графиков открыто много и можно сократить загрузку процессора. Памяти как раз хватает.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 6 Ответы
- 1063 Просмотры
-
Последнее сообщение JohnChaban