Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
В стек FIFO, реализованный в массиве с плавающим пойнтером*, поступают данные. Среди прочих вычислений необходимо иметь доступ к мин-макс значениям, находящимся в данный момент в стеке. Как это эффективно реализовать? Есть ли нативная сишная ф-ция вычисления мин-макс массива? В голову пришло лишь: - хранить еще два пойнтера на индексы последних значений, признанных мин-макс, и проверять их на присутствие в стеке при поступлении каждого нового значения. Если они вышли из стека - перебором выявить новые мин и/или макс. Быстродействие крайне критично. Из-за этого и обратился к C++ * не знаю, как обозвать - постоянно хранится указатель на индекс, в который произошла последняя запись. Т.е. новым значением перезаписывается самое старое - FO. Без смещения всего стека по массиву. ** C++ почти не знаю. Допиливаю чужую заготовку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 07:31 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underC, Для начала давайте уточним -термины стек и FIFO - взаимоисключающие. Стек это всегда LIFO, а FIFO - это очередь. И данная задача решается для них по разному. У вас очередь или стек? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 08:50 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Две переменные max и min, определяются перед помещением значений в FIFO. При выталкивании значений проверяем на max(min). Если вытолкнули max(min), то перебором находим новое max(min). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 08:57 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Сорри. Я не настоящий сварщик :) В предлагаемой нотации - очередь. FIFO. Или LILO. Как удобнее. Пулеметная лента. Не магазин. Стек, прдн, очередь, выдавливается. Т.е. всегда заполнен(а) полностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 09:04 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
m_Sla, m_SlaДве переменные max и min, определяются перед помещением значений в FIFO. При выталкивании значений проверяем на max(min). Если вытолкнули max(min), то перебором находим новое max(min). Схоже с тем, что я предложил выше. Только хранятся сами значения, а не указатели. А т.к. в стеке м.б. несколько величин, равных граничным, то в моем варианте можно оптимизироваться под хранение указателя на наиболее актуальную максимальную величину, перебирая стек с последнего вошедшего. Тогда не придется перебирать при выходе каждой величины, равной граничным. На длинных стеках может возникнуть существенная экономия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 09:20 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
А как много операций вставки - удаления - запроса минимакса будет? Какова длина очереди. Может там и оптимизировать нечего. Рискну предположить, что этот участок не станет узким местом системы. Структура данных с затиранием иногда называется кольцом. забавная книжка про узкие места http://yandex.ru/yandsearch?text=голдратт+цель+-+процесс+непрерывного+совершенствования&lr=213 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 09:37 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underC, Если макс. размер очереди небольшой (десятки байтов), то быстрее всего будет перебор при удалении (как вы изначально предложили). Если же очередь существенно больше (например миллионы байтов), то данный алгоритм имеющий сложность O(n) будет не самой эффективной реализацией. Если заменить массив на список, и вести два списка - один в порядке очереди, а другой (параллельный для тех же элементов списка) в порядке сортировки, то можно добиться сложности O(log(n)). Сортированный список можно эффективно реализовать с помощью std::multiset, а список для очереди - введя указатель на предыдущий элемент в каждом элементе multiset. Набросок структуры данных: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 09:41 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
На самом деле в моем примере в multiset скорее надо хранить не item, а указатель item* - так проще реализовать. Если будете реализовывать в этом направлении, то напишу подробнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 09:52 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Vladimir Baskakov , * как много операций вставки - удаления - запроса минимакса будет? - непрерывно поступают данные с неких датчиков со скоростью до 500 отсчетов секунду в пределе, стандартно - 5-10 в сек. Каждое входящее надо проверять на минмакс и фиксировать, если оно таково. * Какова длина очереди - три-четыре самостоятельных очереди с максимальной длиной до 10 тыс. Из расчета, чтобы охватить хотя бы 3-4 минуты в экстремуме (0.2 мсек Х 10'000 pcs) * Рискну предположить, что этот участок не станет узким местом системы. - Ну, за всю систему, конечно, не самое-самое. А на этапе обработки сырых данных - самое узкое. Из сложной статистики, вычисляемой на каждом тике еще считаются (но все тривиально): - приращение очереди: (Chg = New - Old); - сумма значений очереди: (Sum = Sum + Chg); - скользящее среднее: (Avg = Sum / Siz); - диапазон минмакс: (Dnx = Max - Min) Так что, все упирается в минмакс... На книжку обязательно взгляну. Снкс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 10:20 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Спасиюо. Чуть позже отвечу. Надо отлучиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 10:21 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underC, Я тут подумал, что может эффективнее и проще сделать по другому. Очередь оставить такой какая у вас уже есть (в массиве). А отдельно вести счетчик уникальных значений. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. Теперь у нас add и remove выполняются за O(log(n)) - где n, не размер очереди, а кол-во уникальных значений, что худшем случае то же самое, а в лучшем - существенно меньше. get_min и get_max выполняются за O(1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 10:43 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Поправка: Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 10:47 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underC, 1) Бъем очередь на сегменты. например, на 100. 2) на каждом сегменте храним время старта и стопа, считаем мин, макс, среднее. 3) при добавлении/удалении значения пересчитываем только значения в блоке. 4) Когда блок покидает или добавляется пересчитываются общие значения Еще одна оптимизация. При обычном поиске мин/макс в массиве делается два сравнения на элемент. Можно делать так, берем два значения из массива. сравниваем их между собой, а потом максимальный сравниваем с макс и меньший с мин. Итого получается 1.5 сравнения на элемент. Ускорение на 25% ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 11:18 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Смотрите, люди 500 вставок в секунду в mySql делают. http://www.sql.ru/forum/actualthread.aspx?tid=973281 И он держит вроде. Неужели самописная очередь, даже неоптимальная, не работает в 5-6 раз быстрее? Какая структура данных - что кроме замеренного числа записывается? Может сделать конвеер. Приемник данных заполняет блоки в памяти, второй паралельно работающий процесс скидывает полностью заполненные блоки в файлы, а уже третий, фоновый - все обрабатывает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 11:36 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. на джаве - милион тупых минимаксов - секунд 30 на глаз.... а на С++? 500 в сек - с запасом, правда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 11:58 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underC Vladimir Baskakov , * как много операций вставки - удаления - запроса минимакса будет? - непрерывно поступают данные с неких датчиков со скоростью до 500 отсчетов секунду в пределе, стандартно - 5-10 в сек. Каждое входящее надо проверять на минмакс и фиксировать, если оно таково. * Какова длина очереди - три-четыре самостоятельных очереди с максимальной длиной до 10 тыс. Из расчета, чтобы охватить хотя бы 3-4 минуты в экстремуме (0.2 мсек Х 10'000 pcs) * Рискну предположить, что этот участок не станет узким местом системы. - Ну, за всю систему, конечно, не самое-самое. А на этапе обработки сырых данных - самое узкое. Из сложной статистики, вычисляемой на каждом тике еще считаются (но все тривиально): - приращение очереди: (Chg = New - Old); - сумма значений очереди: (Sum = Sum + Chg); - скользящее среднее: (Avg = Sum / Siz); - диапазон минмакс: (Dnx = Max - Min) Так что, все упирается в минмакс... На книжку обязательно взгляну. Снкс.Поиск max и min перебором из массива double data[10000] на моем компьютере выполняется за 0,00002сек. А искать надо только при выталкивании max или min. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 12:28 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
так и я про что. Узкое место - не тут))))) но пооптимизировать - если есть время - это мы любим. и поговорить о оптимизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 12:37 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Vladimir Baskakov, Мы давали тестовое задание при приеме работу с похожей задачей. Предположим, наше приложение получает по разным каналам данные. Данные поступают пачками переменного размера. Т.е. в некоторый момент времени дергается функция on_get_data(size_t size); периодически дергается метод double get_average_speed() который должен возвращать приблизительную (+-10%) среднюю скорость за последние n секунд. Интервал n задается при старте приложения. Интнервал может быть от 60 секунд до суток или даже месяца. частота событий получения данных также может быть от тысяч за секунду до раза в сутки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 15:29 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underCAnatoly Moskovsky, Спасиюо. Чуть позже отвечу. Надо отлучиться.Отлучился, млин, сходил за хлебушком :) Полсоюза за это время проехал. Прошу прощения за пропажу топикстартера. Спасиюо за высказанные соображения и примеры. С позволения присутствующих - возьму еще таймаут. В понедельник-вторник вернемся к обсуждению, ОК? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2013, 09:04 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Ну вот. У меня есть первые результаты и замеры. Я реализовал вот такой алгоритм в модели на VBA, которую предполагаю переносить в сишную длл: VBA code Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. У меня этот цикл выполняется для очередей длиной: Код: plaintext 1. 2. 3. 4. Vladimir Baskakov * на джаве - милион тупых минимаксов - секунд 30 на глаз m_Sla * double data[10000] на моем компьютере выполняется за 0,00002 сек Спасибо за цифры. На джаве - это, конечно, ни в какие ворота :) А вот 2 мксек на 1000 записей - меня это более чем устраивает. Под VBA производительность получается на два порядка ниже. И то, с учетом, что m_Sla ворочал запятую, а уменя все целочисленное. Но это только модель. Потом все портируется на С и будет летать :) Важно алгоритм оценить. Теоретически, можно еще ускориться за счет линейной записи кода - уйти от второго for (это я чисто для экономии строчек кода и понимания так записал). Можно еще попытаться ускориться за счет уточнения - кто, мин или макс все-таки вышел, и проверять дальше только на него. vromanov , об этом шла речь в 14191192 ?vromanovЕще одна оптимизация. При обычном поиске мин/макс в массиве делается два сравнения на элемент. Можно делать так, берем два значения из массива. сравниваем их между собой, а потом максимальный сравниваем с макс и меньший с мин. Итого получается 1.5 сравнения на элемент. Ускорение на 25% И там же 14191192 : Бъем очередь на сегменты. например, на 100 * 2) на каждом сегменте храним время старта и стопа, считаем мин, макс, среднее. Непонятно, зачем хранить время (хоть оно у меня хранится). * 3) при добавлении/удалении значения пересчитываем только значения в блоке. Недостаточно. После удаления текущего минимакса, ближайший может оказаться в другом блоке. Anatoly Moskovsky Спасибо за примеры кода. Но я, к сожалению, совершенно поверхностно знаю язык - лишь в рамках той длл, которую мне придется модифицировать. Поэтому я просто не могу по достоинству оценить предложенное. И хотелось бы остаться в рамках того, что я смогу потянуть самостоятельно без погружения в маны. Интересны приведенные оценки сложности алгоритма O(log(n)). Что можно почитать на эту тему? Если не очень заумное :) Vladimir Baskakov 14191364 * Какая структура данных - что кроме замеренного числа записывается? Фактически очередь - это двумерный массив, т.к. значений (полей), одновременно в нее передающихся - несколько, плюс таймстемп на каждую запись, который я проставляю самостоятельно. Очередей таких - несколько разных длин. Т.е. элементы самой короткой очереди дублируются в более длинной. Кстати, в этом направлении тоже, думаю, есть место для оптимизации. Но мне пока надо в самом простом, но эффективном варианте. * Может сделать конвеер. Приемник данных заполняет блоки в памяти, второй паралельно работающий процесс скидывает полностью заполненные блоки в файлы, а уже третий, фоновый - все обрабатывает? Это было бы шикарно. Но я не потяну самостоятельно. Да и еще такой аспект - все сейчас обрабатыывается в Access через подключенный API в COM-модели. Поэтому синхронная обработа навязана. Можно было бы говорить о буфере, но по ТЗ указано мириться с потерянными тиками в пользу самых свежих. Т.е. выбор сделан в пользу актуальности, за счет целостности, полноты данных . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 23:31 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
авторСпасибо за цифры. На джаве - это, конечно, ни в какие ворота :) Почему? В Ваши ворота пролазит с запасом. у Вас же 1000 замеров в секунду? и у меня на джаве 10 К записей, а не 1 К. И ВБА - уж тормозит так тормозит. Да и еще такой аспект - все сейчас обрабатывается в Access Ну посмотрите шутки ради - сколько времени оно туда льется. Через COM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 09:46 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Vladimir Baskakov , * и у меня на джаве 10 К записей, а не 1 К. Вот, что было написано выше: "милион тупых минимаксов - секунд 30 на глаз" . Пусть 20. Итого, на 1'000 циклов: Код: plaintext 1. 2. Что уж так за яву расстраиваться :) Странно было бы от нее большего ожидать. * В Ваши ворота пролазит с запасом. у Вас же 1000 замеров в секунду? Пролазит. Ну и что? Пролазит-то лишь среднебольничная температура... И я называл лишь ориентировочную цифру общего числа отсчетов за секунду. 500. В качестве ориентира. Об интервале между самими тиками я не обмолвился. За секунду может пройти всего два отсчета, но с минимальным зазором между ними. Минимальный зазор, который я наблюдаю - 11 мксек. Борьба за быстродействие это не самоцель. С учетом COM-модели мне всегда будет мало скорости, т.к. хочется как можно меньше потерять отсчетов, а для этого надо как можно раньше освободить систему для следующего тика. * И ВБА - уж тормозит так тормозит. Ну, надо уметь его готовить :) А цифры выше я привел. * Ну посмотрите шутки ради - сколько времени оно туда льется. Через COM. Да не надо шуток. Смотрю постоянно :) БД - десятка полтора целочисленных полей и три дабла, строковых нет. В онлайне пишется меньше чем за 1 мск (0.001 сек) запись (это включая сопутствующие статистические вычисления) и еще полно мест для оптимизации. Последовательное чтение (имитация онлайна, тоже с вычислениями) - до 80'000 записей в сек. Access на удивление шустер. Пишется до 1.5 млн записей в сутки (обычно 700-800 тыс). Это в среднем чуть больше 10 записей в сек. В среднем! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 11:48 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underCВ стек FIFO, реализованный в массиве с плавающим пойнтером*, поступают данные. Среди прочих вычислений необходимо иметь доступ к мин-макс значениям, находящимся в данный момент в стеке. Можно сделать стек указателей на дерево. А в дереве max/min ищется довольно быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 13:16 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
mayton , это мне сейчас не потянуть. Надо учиться. На заметку возьму, как и предложения Anatoly Moskovsky про уникальные значения и Vladimir Baskakov про конвейер. Конечно, вместо того, чтобы из API выплевывать в VBA, оттуда в сишную длл, а потом обратно, лучше на си написать шлюз (бридж) к API со всей математикой, а аксу оставить исключтельно БД-шный функционал. В плане портирования предложенного алгоритма на C++ возникает следующий вопрос - как передать из VBA в сишную длл массив значений ? Сейчас я передаю в нее несколько параметров. Вот у меня вызов инициализации очереди: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Вот передача новых значений к пересчету: Код: plaintext 1. 2. 3. 4. 5. 6. Я, конечно, могу увеличить число передаваемых параметров, но может лучше массивом. А еще более важно массивом же из нее получить результаты вычислений . Сейчас для получения одного из результатов вычислений я вызываю ее функцию с определенным параметром. И так несколько раз. Слава богу, они не все нужны одновременно. Но гораздо интереснее получить все махом за один вызов и уже в VBA разбираться с результатами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 13:59 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underC mayton , это мне сейчас не потянуть. Надо учиться. На заметку возьму, как и предложения Anatoly Moskovsky про уникальные значения А нужно потянуть. Единственные структуры данных которые быстро выбирают max/min - это деревья и пирамида (Heap). Пирамида описана у Вирта в книге. Она более компактна но я не уверен что поможет в поиске min и нужно проверить насколько она быстра при inserts/deletes. Дерево в этом плане конечно-же лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 17:21 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Да я не расстраиваюсь за джаву. Просто интересно. 1000 циклов минимакса на массиве в 1000 элементов Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 1000 циклов поиска минимакса по 1000 элементов = 3 милисикунды. один проход по массиву (2..4)*10 в -6 ой. те 100 000 измерений в секунду смогут пролезть с некоторым запасом. Если каждое измерение сопровождается поиском минимакса. А у Вас - 500 ~ 1 000. Мне думается, что запас пока еще весьма существенный.... Чем иногда невыгодны усложненные структуры данных - линейный массив почти наверняка будет жить в кэше процессора. И внутрипроцессорный оптимизатор может сам правильно понять, что от него хотят. А он у пентиумов и выше - не такой тупой. И может получится так, что работа со связанной структурой на таких незначительных объемах не даст справедливо ожидаемого логарифмического выигрыша. С учетом того, что даже на "медленной джаве" от которой никто ничего хорошего не ждет (шутка) запас по времени 100 кратный.... Стоит ли искать еще большего выигрыша? На С++ должно быть в полтора-2 раза быстрее минимум. Там скорее чтоб работало надо играть с приоритетностью процесса у ОС - что б ему квантов времени давали полным половником. Вот где ресурс. Возможно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 18:10 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Я смотрю автора ещё никто не спросил какого типа данные у него в очереди... И почему бы не считать этот min/max при необходимости, а не на лету?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 18:22 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Vladimir BaskakovЧем иногда невыгодны усложненные структуры данных - линейный массив почти наверняка будет жить в кэше процессора. Ну например хип, про который выше говорилось, в большинстве случаев может храниться тоже как массив. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 18:36 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЯ смотрю автора ещё никто не спросил какого типа данные у него в очереди... И почему бы не считать этот min/max при необходимости, а не на лету?.. Тут бы еще узнать зачем оно вообще надо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 18:37 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. что-то со мной не так? почему сишный код из под GCC 3-4-5 работает медленнее джавского (6)? почему миллион циклов по 10000 сравнений выполняется 43522 условных милисекунды? не расстроен - удивлен.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 18:55 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
У меня почему-то в голове крутиться аналогия с расчётом "скользящего среднего" если считать FIFO - статистической выборкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 18:59 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЯ смотрю автора ещё никто не спросил какого типа данные у него в очереди... И почему бы не считать этот min/max при необходимости, а не на лету?.. Я оговаривался - целочисленные.авторm_Sla ворочал запятую, а уменя все целочисленное. Необходимость такая есть. Надо просто принять это :) Anatoly MoskovskyТут бы еще узнать зачем оно вообще надо :)Да все очень просто. Нужно продемонстрировать, что существующая методика и инструментарий для сбора, оценки м анализа параметров процесса устарели и нужно вложиться в нормальную разработку. И уж если я на коленке смог собрать более эффективную и, главное, работающую модель, то наверное следует нанять профессионалов и сделать все красиво :) maytonУ меня почему-то в голове крутиться аналогия с расчётом "скользящего среднего" если считать FIFO - статистической выборкой.Не удивительно, что крутится :)авторна каждом тике еще считаются (но все тривиально): - приращение очереди: (Chg = New - Old); - сумма значений очереди: (Sum = Sum + Chg); - скользящее среднее: (Avg = Sum / Siz); - диапазон минмакс: (Dnx = Max - Min) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 19:11 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Vladimir Baskakov почему сишный код из под GCC 3-4-5 работает медленнее джавского (6)? почему миллион циклов по 10000 сравнений выполняется 43522 условных милисекунды? не расстроен - удивлен.... А шо ж вы в джаве не сделали миллион циклов по 10000, а всего 1. Сделайте - тогда будете расстроены ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 19:15 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underCЯ оговаривался - целочисленные. "Я" бывают разные. (с) Кролик. Целочисленные значения имеют разрядность от 1 до 64 бит минимум. Какие у тебя? До разрядности в 8 бит будет эффективным уже предложенный способ счётчиков. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 19:24 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyVladimir Baskakov почему сишный код из под GCC 3-4-5 работает медленнее джавского (6)? почему миллион циклов по 10000 сравнений выполняется 43522 условных милисекунды? не расстроен - удивлен.... А шо ж вы в джаве не сделали миллион циклов по 10000, а всего 1. Сделайте - тогда будете расстроены Вот откуда растут двойные стандарты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 19:27 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov"Я" бывают разные. (с) Кролик. Целочисленные значения имеют разрядность от 1 до 64 бит минимум. Какие у тебя? До разрядности в 8 бит будет эффективным уже предложенный способ счётчиков. Мои целочисленные - VBA-шный тип long: F1Long (long integer) variables are stored as signed 32-bit (4-byte) numbers ranging in value from -2,147,483,648 to 2,147,483,647 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 19:56 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underCМои целочисленные - VBA-шный тип long: Ну, раз ты так считаешь... Тогда следующий вопрос: кто и с какой частотой использует эти min/max значения? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 20:03 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, * Ну, раз ты так считаешь... это VBA так считает. Чем-то мои лонги не понравились... * кто и с какой частотой использует эти min/max значения? С частотой поступления тиков все это предварительно считаемое добро участвует в последующей математике системы принятия решения. Также, параллельно с сырыми данными, пишется статистика. Для истории и для оффлайн анализа как наблюдаемых процессов, так и поведения самой системы наблюдения за ними ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 20:47 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underCэто VBA так считает. Чем-то мои лонги не понравились... То, что считает какой-то VBA никому неинтересно. Гораздо интереснее мнение того, кто эти данные присылает. Конкретнее - диапазон генерируемых значений. underCС частотой поступления тиков все это предварительно считаемое добро участвует в последующей математике системы принятия решения. То есть принятие решения осуществляется на каждое поступление новых данных, 500 раз в секунду? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 21:32 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
У меня был один простой вопрос - уважаемые спецы по Си, как вам видится мой алгоритм и получу ли я ожидаемую (в пределах +- трамвайная остановка) скорострельность. Спасибо всем явно или косвено подтвердивших работоспособность алгоритма и особенно тем, кто не поленился и смоделировал. Vladimir Baskakov , m_Sla - снкс. Спасибо остальным за высказанные идеи и ориентиры на будущее. Осталось два простых вопроса. Их, к сожалению, залистали: - как передать в длл массив значений разом вместо нескольких параметров , и - как получить из нее так же массив значений, вместо нескольких вызовов . Dimitry Sibiryakov, * Гораздо интереснее мнение того, кто эти данные присылает Уточни, плз, что имеется ввиду? Если только это: * Конкретнее - диапазон генерируемых значений. то датчиками генрируется абстракщина, понятия не имею. А на выходе из API - лонги любого знака. Порядок величин - 10^5, не более. За исключением моего собственного сквозного таймштемпа, который я проставляю с точностью 100 мксек. Так что у него порядок до 10^9. авторТо есть принятие решения осуществляется на каждое поступление новых данных, 500 раз в секунду?Я оценил сарказм. Позволь и мне? Не поверишь - именно так. 500 раз в секунду и даже с большей частотой оператор сидит ровно на заднице и не подпрыгивает к пультам, а принимает, и принимает и снова принимает решение сидеть так же ровно и дальше . И лишь несколько раз в день он отрывает тохес от стула потому что загорается большая красная лампочка. Сказать почему она загорается? В частности потому, что 500 раз в секунду считается (среди прочего) минмакс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 22:58 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underCНе поверишь - именно так. 500 раз в секунду и даже с большей частотой оператор сидит ровно на заднице и не подпрыгивает к пультам, а принимает, и принимает и снова принимает решение сидеть так же ровно и дальше . И лишь несколько раз в день он отрывает тохес от стула потому что загорается большая красная лампочка. Сказать почему она загорается? В частности потому, что 500 раз в секунду считается (среди прочего) минмакс. Я сильно сомневаюсь что ваша SCADA или АСУТП может требовать от человека-оператора требовать реакции с частотой 500 Гц. Субъективно люди зрением видят изменяюшуюся картинку с частотой 10 Гц а принимают решение с лагом еще большим. Поэтому в твоём случае буферизировать данные можно сколь угодно быстро. Но аналитику по ней гонять 10 раз в секунду. Оно и будет ладненько. Я готов спорить на ящик коньяку что разница между 500 Гц-ным замером и 10 Гц-ным на практике не будет заметна. Тем более что скользящие значения не будут изменяться быстро. Они в ПРИНЦИПЕ быстро не могут скакнуть. Окно не позволит. Прыгать щас через ж...пу и включать хардварные расчёты на Cuda-х и прочих железяках только по тому что чел. который ставил задание слабо себе понимал разницу между частотой выборки и частотой ПРИНЯТИЯ РЕШЕНИЯ явно не стоит. Ну вот ... в таком вот аспекте. n'est-ce pas? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 23:42 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underCдатчиками генрируется абстракщина, понятия не имею. А ты поинтересуйся. Потому что если диапазон значений невелик и разброс - тоже, то быстрейшим способом получить экстремумы будет массив счётчиков значений. Как тебе уже сказали. underCЯ оценил сарказм. Позволь и мне? Не позволю. Потому что это не был сарказм. Я знаю что такое ИИ и системы принятия решений. Если их алгоритмы должны работать в реальном времени, на каждую порцию данных, тогда - да, min/max надо считать при занесении данных в буфер. Если они работают реже чтобы не дёргать зазря исполнительные цепи из-за кратковременных выбросов - нет смысла мучить сборщика данных. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 00:36 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underC - как передать в длл массив значений разом вместо нескольких параметров , и - как получить из нее так же массив значений, вместо нескольких вызовов . Используй структуру. Зачем тебе массив передавать? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 05:45 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
maytonПоэтому в твоём случае буферизировать данные можно сколь угодно быстро. Но аналитику по ней гонять 10 раз в секунду. С точки зрения общей нагрузки на систему , держать счетчики в гарячем кеше процессора или регистрах будет выгоднее. , чем раз в 10 секунд их продувать расчетом. Но это пока не нужна кумулятивная статистика по нескольким потокам на разных процах. Вот ее уже можно собирать из счетчиков разных нитей раз в 10 сек, или даже реже вобщем с дисткретностью, с которой оператор может поднять свой тухес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 11:03 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
maytonЯ сильно сомневаюсь [...] Ну вот ... в таком вот аспекте. n'est-ce pas? mayton , c'est tout. В смысле - pourquoi cure l'accordeon? ;) Ну зачем же так серьезно о метафоре, тем более анонсированной как сарказм в ответ на сарказм :) Конечно же, мой оператор, чтобы прервать свое бездействие, реагирует не на изменение минмакса с соответствующей частотой, а лишь на лампочку. Вобщем-то, это есть в завершающей метафору фразе. Смысл этой метафоры совсем даже философский - бездействие так же суть следствие принятия решения, как и действие. Если кто знаком с уставами или кодексом, то знает, что бездействие часто наказывается даже сильнее. Типа: "... если боевое дежурство приведо к последствиям, во избежание которых оно назначено..." - ну и далее кирдык по тексту :) А касательно мувингов (скользящих средних) - это ведь отдельная песня. Инструмент хороший, но... Там столько "но"... короче, его уметь надо готовить. С ними, в частности и сравнивается минмакс. Тут нюанс в том, что если мы говорим о процессах физического, природного характера, т.е. о процессах, обладающих определенной инерцией (ну, типа нагрев заготовки, разгон торможение э-двигателя), то мувинги и их комбинации справляются на ура. Если же наблюдаемые процессы безынерционны и, более того, склонны мгновенно менять знак (вектор) на противоположный, то мувинги будут совсем даже во вред. И вот отслеживание этой точки перелома есть одна из основных задач данной, простите, задачи :) На передний план выходит фильтрация шума (естественных смен знака). Вот все это в комплексе и определеят мое нежелание избавиться от избыточности как самих собираемых данных, так и аналитики, проводимой над ними. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 11:17 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovunderCдатчиками генрируется абстракщина, понятия не имею.А ты поинтересуйся. Потому что если диапазон значений невелик и разброс - тоже, то быстрейшим способом получить экстремумы будет массив счётчиков значений. Как тебе уже сказали.Может в этом и есть сермяжная правда. Но ведь таким образом ты меня подталкиваешь к написанию собственного API, а это не есть гуд. Сырые данные с датчиков... гальванические развязки, калибровки, шумы... Ты это все серьезно? Dimitry SibiryakovunderCЯ оценил сарказм. Позволь и мне?Не позволю. Потому что это не был сарказм. Я знаю что такое ИИ и системы принятия решений. Если их алгоритмы должны работать в реальном времени, на каждую порцию данных, тогда - да, min/max надо считать при занесении данных в буфер. Если они работают реже чтобы не дёргать зазря исполнительные цепи из-за кратковременных выбросов - нет смысла мучить сборщика данных. * Не позволю. Ну, я ужЕ, сорри :) * Я знаю что такое [...] Ну, я про себя так не скажу. А вот очередной притчей поделюсь. Про восходящие(!) стадии становления философа: - Я знаю, что я знаю. - Я знаю, что мало знаю. - Я знаю, что ничего не знаю (это уже на смертном одре). Так вот. Ты рассматриваешь кратенько, абрисно(!) описанную мной систему лишь в удобном для твоего знания и понимания разрезе. Оговорюсь о таком, к примеру, нюансе - есть один чуткий и нежный датчик. Так вот если в его отсчетах среди минмаксов начнут преобладать минимумы с явной периодичностью, а период будет иметь тенденцию уменьшаться, то готовь его к замене, он наелся. Если же он, начинает давать хаотичные выбросы в макс, то надо проверить его эл.цепь или же правильность установки. И таких примеров полно. Ты мне дашь гарантию, что заниженная частота опросов его минмаксов не стушует картину его тенденции к выходу? Или вообще не снивелирует ее? Йенг даешь на пятаки? Я не могу понять, почему нельзя просто принять на веру мое "надо"? Даже если это просто мой каприз. Даже, если это просто дурость. Помогите разобраться с этим гребаным Си, и не учите меня жить ;) Я ведь говорил уже - да часть информации избыточна и мои требования к системе тоже. Но это ведь только стадия если не разработки, но все еще обкатки. Пока есть запас прочности (а замеры мужиков выше это подтверждают) - надо делать в самой простой модели, соответствующей моему низкому скиллу в Си . Вот когда заработает и станет это узким местом - вот тогда и вернемся к вопросу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 11:30 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underCЕсли же наблюдаемые процессы безынерционны и, более того, склонны мгновенно менять знак (вектор) на противоположный, то мувинги будут совсем даже во вред. И вот отслеживание этой точки перелома есть одна из основных задач данной, простите, задачи :) На передний план выходит фильтрация шума (естественных смен знака). Ничего в физике не происходит просто так , всему есть причина и следствие. Иногда причина и следствие меняются местами , но чаще их путают. Направление вы выбрали правильное. Точка перелома есть первая производная функции. Первой может быть мало, например вход системы в насыщение вы можете не поймать. underCВот все это в комплексе и определеят мое нежелание избавиться от избыточности как самих собираемых данных, так и аналитики, проводимой над ними. Тоже правильно , чем чаще дискретизация ( дельта диференцирования) , тем точнее результат, и точнее можно востановить оригинальную функцию из производной. Более точное определение оригинальной функции даст возможность более точно предсказывать поведение системы когда будет набрана статистика. НО за все нужно платить, вам нужно найти баланс избыточности и скорости обработки. что бы не пропустить момент underC"... если боевое дежурство приведо к последствиям, во избежание которых оно назначено..." А то иногда бывает, что за деревьями леса не видно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 11:54 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underCМожет в этом и есть сермяжная правда. Но ведь таким образом ты меня подталкиваешь к написанию собственного API, а это не есть гуд. Сырые данные с датчиков... гальванические развязки, калибровки, шумы... Ты это все серьезно? Какие развязки, какие калибровки, какое, нафиг, собственное API? Я тебе предлагаю разобраться с тем, что в твоей системе на входе. Чтобы точнее определить технические требования. И тем самым расширить диапазон возможных решений. Но, конечно, раз уж ты решил удариться в экстремизм, то нету у тебя другого выбора кроме как сканировать весь твой массив раз за разом. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 11:57 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyVladimir Baskakov почему сишный код из под GCC 3-4-5 работает медленнее джавского (6)? почему миллион циклов по 10000 сравнений выполняется 43522 условных милисекунды? не расстроен - удивлен.... А шо ж вы в джаве не сделали миллион циклов по 10000, а всего 1. Сделайте - тогда будете расстроены Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. ну не миллион. ну ну один меньше. или я что-то путаю(((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 11:58 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
а как происходит считывание данных. программа куда-то заглядывает постоянно, и если там что-то есть - запускает обработчик? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 12:02 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
m_Sla, спасибо за код, но я в некоторых непонятках. m_Sla Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 1. Если я правильно понимаю, то структуры в C++, это как пользовательские типы в VBA. Но это ведь имеет смысл, если участвуют данные разных типов, а у меня ведь все лонги. 2. Ну, пусть структура. Но я в этом коде не увидел, ни как передать ее в длл из VBA, ни как выплюнуть результаты вычислений обратно. Это же пример лишь как ворочать ее внутри длл. Повторюсь (уточню). В длл я должен передать вновь поступившие показания нескольких датчиков. Они (по твоему коду) будут сохранены в массивах data (у тебя он один, но можно добавить ему измерение). Сейчас я передаю их параметрами, а хотелось бы - массивом. Или типом, т.к. из VBA, чтобы он был проинтерпретирован внутри как структура. Из длл я должен получить минмаксы по каждому из датчиков. Массивом ли, струтурой ли (преобразованной как-то обратно в тип), но не цепочкой обращений за мин, за макс, за чем-то там еще. Правильно я понимаю, что невозможно передать из VBA в сишную длл параметр по ссылке? Чтобы в VBA этот параметр отразил модифицированное внутри длл его значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 12:10 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov[ Но, конечно, раз уж ты решил удариться в экстремизм, то нету у тебя другого выбора кроме как сканировать весь твой массив раз за разом. Решение есть , Майтон там вроде предлагал дерево. У которого с одного конца будет макс , с другого мин. Какой профит будет получен от дерева , зависит от отношения размера всей записи с параметром к размеру самого параметра измерения. Чем больше разница , тем больше будет профита от дерева. Есть массив записей рядом есть некий мап ( дерево) , в котором хранится значение параметра и индекс в массиве записей. Просканировав мап можно считать спектральную статистику значений , не продувая сковзь кеш процессора данные из записей которые не нужны для расчета. Выйти на критичные точки в массиве можно по индексу , и посмотреть на них и окресности более детально. На вставку в мап значения придется потратить некие ресурсы. Зато это потом развяжет руки в алгоритмике расчета необходимости перемещения тухеса. Приблизительно так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 12:18 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Vladimir Baskakovа как происходит считывание данных. программа куда-то заглядывает постоянно, и если там что-то есть - запускает обработчик?Все построено на событиях класса. API предоставляет несколько классов, один из которых дает события - датчик такой-то, значение такое-то, ну и еще некую сопроводиловку. А уж что там внутри API - хз. Наверное он как-то сам опрашивает их, или они сами что-то генерят, хз... Датчики цепляются к черному ящику (или к репитерам, если длинный шланг), ящик через COM, LPT, USB и еще какую-то хрень (любой единственный, на выбор) - к компу или к серверу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 12:19 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Vladimir Baskakovну не миллион. ну ну один меньше. или я что-то путаю(((( Вы не туда смотрите. Посмотрите на ваш код на джаве. Там совсем другое число итераций внешнего и внутреннего цикла, чем в коде на С++. Чтобы сравнивать код на двух языках, нужно чтобы они делали одно и то же. И причем достаточно долго, т.к. для мелкой задачи погрешность измерения может быть сравнима со временем работы, или даже существенно превышать его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 12:20 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
ДохтаР , спасибо за поддержку, что концептуально я смотрю в правильном направлении. 2ALL , с минмаксами в сегодняшнем варианте мы разобрались и сделали наметки на будущее. Спасибо всем. Щаз другая задача - как эффективно передать в длл новые значения и получить обратно расчеты? Сейчас длл выглядит так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Вызов из VBA выглядит так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Возможно ли вместо отдельных параметров передавать в длл массив новых значений и обратно получить не поштучно, а массивом же? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 13:29 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underC ДохтаР , спасибо за поддержку, что концептуально я смотрю в правильном направлении. Всегда пожалуйств :) underCЩаз другая задача - как эффективно передать в длл новые значения и получить обратно расчеты? Возможно ли вместо отдельных параметров передавать в длл массив новых значений и обратно получить не поштучно, а массивом же? Ты же сишник, :) Передай в функцию адрес массива в куче и размер. зы Тока мой тебе совет , не рисуй лапшекода с выделением памяти в приложении и удалением в библиотеке и наоборот. Выделил память в библиотеке , удаляй в билиотеке, выделил в приложении удаляй там же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 13:41 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
ДохтаРDimitry Sibiryakov[ Но, конечно, раз уж ты решил удариться в экстремизм, то нету у тебя другого выбора кроме как сканировать весь твой массив раз за разом. Решение есть , Майтон там вроде предлагал дерево. У которого с одного конца будет макс , с другого мин. Учитывая постоянные inserts/deletes в дерево оно будет переживать бешеные перебалансировки. Здесь нужно хорошо подумать. Вроде как получили профит на поиске минимакса но просадили общее время фиксации тразнакции. Кстати в топике не зря спрашивали про разрядность. Если она не велика то после записи возможно датчик будет показывать одинаковые значения длительное время. На этом можно сыграть и сжимать поток измерений. Получится что-то вроде RLE в котором искать минимаксы будет быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 14:01 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
ДохтаРТы же сишник, :) Передай в функцию адрес массива в куче и размер. зы Тока мой тебе совет , не рисуй лапшекода с выделением памяти в приложении и удалением в библиотеке и наоборот. Выделил память в библиотеке , удаляй в билиотеке, выделил в приложении удаляй там же.Да какой я сишник... Я на него, как баран на новые ворота смотрю. Вот из первого же поста:автор** C++ почти не знаю. Допиливаю чужую заготовку.Я по VBA в основном и БД :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 14:07 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
ДохтаРТы же сишник, :) Нет, он VBA-шник и писал, что С видит первый раз в жизни. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 14:08 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
mayton... после записи возможно датчик будет показывать одинаковые значения длительное время. Практически не бывает. Дребезг, шум постоянный. Как раз настораживает - когда прямая достаточно протяженная линия, ну, типа больше 10-20 отсчетов. Когда с API-шниками был внятный контакт, с ними вроде вели разговоры о модернизации входных фильтров и доступа к их тонким настройкам. Но воз так там и остался. А сейчас они вообще в эту сторону не смотрят. Страый продукт, разрабы давно поувольнялись-поумирали. Пишите, говорят сами, после API и скажите спасибо, что вообще еще все работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 14:17 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Думаю что дреберг ортогонален к функциям управления или принятия решений. Ну тоесть если идут подряд значения типа: 127,128,127,128,... то можно как-то принять решение об использовании простого ФНЧ. Ну тоесть мы сами примем решение о том что есть собственно полезный сигнал F1 (обычно гладкий, низкочастотный) и есть какой-то шум F2 который (дребезжит и фонит на высоких частотах) но на принятие решения никак не влияет. Здесь я советов давать не могу это надо как-то самому решить на основе знаний об измеряемом объекте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 14:47 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
maytonДумаю что дреберг ортогонален к функциям управления или принятия решений. Ну тоесть если идут подряд значения типа: 127,128,127,128,... то можно как-то принять решение об использовании простого ФНЧ. Ну тоесть мы сами примем решение о том что есть собственно полезный сигнал F1 (обычно гладкий, низкочастотный) и есть какой-то шум F2 который (дребезжит и фонит на высоких частотах) но на принятие решения никак не влияет. Здесь я советов давать не могу это надо как-то самому решить на основе знаний об измеряемом объекте. Не ортогонален, дребезг, его амплитуда и частота, может влиять на средюю температуру по больнице. Нужен некий аналог аппратного фильтра. Как минимум, что бы можно было сказать, что данные измерений или какая то их часть изза наличия шумов имеют сомнительную достоверность. А то получится как я раньше говорил , что за деревьями леса не видно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 15:10 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
А какая разница, аппаратный он или программный? В данной постановке - всё равно. Аппаратный - ну просто улучшенная оптимизация. Может он вообще на аналоговой электронике будет собран. Но смысл то один. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 15:27 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underCmayton... после записи возможно датчик будет показывать одинаковые значения длительное время. Практически не бывает. Дребезг, шум постоянный. Как раз настораживает - когда прямая достаточно протяженная линия, ну, типа больше 10-20 отсчетов. Если функция описывающая процесс, который вы меряеете не должна себя так вести, то произойдет приблизительно следующее. Вы меряеете среднюю температуру по больнице, Температура пациентов в холодильнике морга, влияет на среднюю таемпратуру таким образом, что вы не видите , что в инфекционное отделение массово поступают пациенты и сгорают от гарячки и перемащаются в морг и все начинается по следующему кругу , До тех пор, пока система не уходит в полный разнос с последствиями о которых вы говорили выше : автор"... если боевое дежурство приведо к последствиям, во избежание которых оно назначено..." Показания которые вы меряете, уже есть недостоверными , нужно искать их причину . Я бы причину сбросли на поставщиков датчиков и прочей аппаратной требухи, повесив оператору лампочку "Обнаружены недостоверные показания КИП " Важно математически формально точно обосновать принятие решения о достоверности- недостоверности значений, которые к вам поступают. . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 15:34 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
maytonА какая разница, аппаратный он или программный? В данной постановке - всё равно. Аппаратный - ну просто улучшенная оптимизация. Может он вообще на аналоговой электронике будет собран. Но смысл то один. Смысл одни , а затраты разные. Купить в Китае чипов по доллару за килограм с поствкой за месяц, или потратить пару человеко лет на програмирование от отладку смарт релюшки которая зажигает лампочку "Срочно поднять тухес". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 15:39 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underCЩаз другая задача - как эффективно передать в длл новые значения и получить обратно расчеты? Возможно ли вместо отдельных параметров передавать в длл массив новых значений и обратно получить не поштучно, а массивом же? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 15:55 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
vromanovunderC, 1) Бъем очередь на сегменты. например, на 100. 2) на каждом сегменте храним время старта и стопа, считаем мин, макс, среднее. 3) при добавлении/удалении значения пересчитываем только значения в блоке. 4) Когда блок покидает или добавляется пересчитываются общие значения Еще одна оптимизация. При обычном поиске мин/макс в массиве делается два сравнения на элемент. Можно делать так, берем два значения из массива. сравниваем их между собой, а потом максимальный сравниваем с макс и меньший с мин. Итого получается 1.5 сравнения на элемент. Ускорение на 25% циклическая очередь, сделанная по этому принципу периваривает 1 млн случайных чисел за 78 мс - Так ли сильно нужны деревья (в данном случае)? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 16:12 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Из ВБА вызывается с-шная DLL, и туда надо скормить массив. А где был этот массив до скармливания. Случайно не в базе ACCESS? может SELECT min(...) FROM .... Спасет радикально? От си-шной DLL c деревьями. А то я подозреваю, что время крохами экономится на работе с массивами в С++ и щедро разбрасывается внутри других подсистем... ВБА - он же чистейше интерпретируемый? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 16:29 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
m_Sla , большое спасибо за код 14225120 . Беру таймаут на реализацию. Позже отпишусь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 16:32 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Vladimir BaskakovИз ВБА вызывается с-шная DLL, и туда надо скормить массив. А где был этот массив до скармливания. Случайно не в базе ACCESS? может SELECT min(...) FROM .... Нет. Совсем наоборот. В рекордсеты попадают уже обсчитанные данные. Приходит тик. Все считается, отображается и лишь последним шагом - в рекордсет. И то - через буфер длиной 100-200 записей (короткий, чтобы не бояться за потерю если что). Слив в рекордсет только по заполнении буфера. А все статистические ф-ции DMax, DMin и пр. что в Аксовом SQL, что под чистым VBA - тормоза дичайшие. Да и не доходит до "SELECT ..." дело :) Vladimir BaskakovСпасет радикально? От си-шной DLL c деревьями. А то я подозреваю, что время крохами экономится на работе с массивами в С++ и щедро разбрасывается внутри других подсистем... ВБА - он же чистейше интерпретируемый? Радикально - кончено же нет. Но должен же быть выигрыш. По крайней мере, когда предыдущая математика была вынесена в длл, производительность поднялась (по памяти) с 10-20 до 70-80 тыс записей в сек (это на круг, со всей требухой). Алгоритм мы все хором утвердили. Под VBA он работает уже известно как. m_Sla дал сишную заготовку. Вот реализую, сравню и отпишусь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2013, 17:02 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Странные все какие-то. В условиях было сказано, что главный критерий - быстродействие. Ограничений на память нет в условиях. Тогда проще и быстрее всего вести параллельно еще два стека - для хранения текущих максимумов и минимумов. Pop и Push в эти стеки делаются одновременно с pop и push в основной стек. Если известен предыдущий max и min, очевидно, что при Push-е легко вычислить текущий. Для получения текущего max и min берется верхнее значение соответствующего стека. Нагородили деревьев и сортировок... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2014, 12:12 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2019267]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
92ms |
get tp. blocked users: |
2ms |
| others: | 11ms |
| total: | 196ms |

| 0 / 0 |
