Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193

Оптимизация алгоритма

03.05.2017, 11:18. Показов 1797. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый, хочу обратится за советом. Имею следующее. Получаю данные в 4-ре List<double> (как не важно).
signal_input1(2,3,4). Данные поступают в реальном времени постоянно. Формируется "окно" для так называемой предыстории, что бы по нажатию пользователем на кнопку "Запись" к началу записи будет предыстория. Формирование предыстории выглядит так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
                    int l = Convert.ToInt32(Setting.getWin() * Setting.getFs());
                    if (signal_input1.Count <l)
                    {
                        progressBar2.Invoke(new Action(() => progressBar2.Value=(signal_input1.Count * 100) / l));
                    }
                    if (signal_input1.Count > l)
                    {
                        progressBar2.Invoke(new Action(() => progressBar2.Value = 100));
                        signal_input1 = signal_input1.GetRange(signal_input1.Count - l, l);
                        signal_input2 = signal_input2.GetRange(signal_input2.Count - l, l);
                        signal_input3 = signal_input3.GetRange(signal_input3.Count - l, l);
                        signal_input4 = signal_input4.GetRange(signal_input4.Count - l, l);
                    }
Так же имеются 4-графика ZedGraph в которые вывожу данные для наглядности. Принцип примерно такой же, как и выше.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
                signal_drow1.AddRange(signal_input1.ToArray());
                signal_drow2.AddRange(signal_input2.ToArray());
                signal_drow3.AddRange(signal_input3.ToArray());
                signal_drow4.AddRange(signal_input4.ToArray());
                if (signal_drow1.Count>count)
                {
                     signal_drow1= signal_drow1.GetRange(signal_drow1.Count - count, count);                    
                }
                if (signal_drow2.Count > count)
                {
                    signal_drow2 = signal_drow2.GetRange(signal_drow2.Count - count, count);
                    
                }
                if (signal_drow3.Count > count)
                {
                    signal_drow3 = signal_drow3.GetRange(signal_drow3.Count - count, count);
                   
                }
                if (signal_drow4.Count > count)
                {
                    signal_drow4 = signal_drow4.GetRange(signal_drow4.Count - count, count);
                }
В момент формирование полного окна, когда срабатывает первое условие if (signal_input1.Count > l). Процессор очень сильно нагружается, скажем так, заметно выше, чем обычно. Вопрос в том, как можно упростить данную задачу? =) Буду рад любым подсказкам, т.к. опыта у меня мало пока.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.05.2017, 11:18
Ответы с готовыми решениями:

Оптимизация алгоритма
Есть рабочий алгоритм, его задача - извлечение содержания textBox'a и label'а, установка их на форму в последовательности: label1,...

Оптимизация алгоритма вычисления
Застрял. Если кому не сложно - оптимизируйте, пожалуйста, данный код. using System; using System.Collections.Generic; using...

Оптимизация алгоритма работы со списками
Задача: Управление погрузками в порту. Каждые отрезок времени(условно 5 минут, но это не имеет абсолютно никакого значения) на погрузку...

12
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
03.05.2017, 11:30
Лучший ответ Сообщение было отмечено timur-chak как решение

Решение

timur-chak, Вместо всех вот этих танцев с бубном, создайте класс LimitedQueue:
C#
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
    [Serializable]
    public class LimitedQueue<T> : IEnumerable<T>
    {
        T[] items;
        int start = 0;
        int count = 0;
 
        public LimitedQueue(int capacity)
        {
            items = new T[capacity];
        }
 
        public void AddRange(IEnumerable<T> items)
        {
            foreach (var item in items)
                Enqueue(item);
        }
 
        public void Enqueue(T item)
        {
            items[start] = item;
            count++;
            if (count >= items.Length)
                count = items.Length;
            start = (start + 1) % items.Length;
        }
 
        public T Dequeue()
        {
            if (Count == 0)
                throw new Exception("Queue is empty");
 
            count--;
            start = (start - 1 + items.Length) % items.Length;
            return items[start];
        }
 
        public T Peek()
        {
            if (Count == 0)
                throw new Exception("Queue is empty");
 
            if (start == 0)
                return items[items.Length - 1];
            else
                return items[start - 1];
        }
 
        public int Count
        {
            get
            {
                return count;
            }
        }
 
        public void Clear()
        {
            start = 0;
            count = 0;
        }
 
        public IEnumerator<T> GetEnumerator()
        {
            for (int i = 0; i < count; i++)
                yield return items[(start - i + items.Length) % items.Length];
        }
 
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
и потом используйте на здоровье, не задумываясь о всяких извращениях типа GetRange.
1
25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193
03.05.2017, 12:24  [ТС]
Storm23, немного затупаю, не могли бы объяснить смысл методов класса, если вам не сложно.

Добавлено через 16 минут
А, извините, разобрался.

Добавлено через 11 минут
Storm23, Нет, видимо не до конца я понял. При изменение коллекции, меняются переменные start и count, а items не изменяется. Не приведет ли это к переполнению памяти?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
03.05.2017, 13:00
Цитата Сообщение от timur-chak Посмотреть сообщение
Не приведет ли это к переполнению памяти?
Нет. Посмотрите внимательно код, пройдитесь дебагером, посмотрите что будет если добавить в очередь элементов больше чем размер окна.
Цитата Сообщение от timur-chak Посмотреть сообщение
а items не изменяется
Да, не меняется, у вас же очередь ограниченная. Размер массива равен размеру "окна".
1
25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193
03.05.2017, 14:40  [ТС]
Storm23, Чувствую себя дурак, немного не верно понял смысл класса, а он очень прост. Теперь уж точно разобрался, спасибо за совет.

Добавлено через 37 минут
Storm23, Подскажите пожалуйста как получить на выходе массив значений, в случае если количество значений не превысило окно?. Я сделал просто метод:
C#
1
2
3
4
public T [] ToArray()
        {            
            return items;
        }
Но массив будет заполнен нулями до заданной размерности.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
03.05.2017, 14:43
Цитата Сообщение от timur-chak Посмотреть сообщение
Подскажите пожалуйста как получить на выходе массив значений
C#
1
2
3
using System.Linq;
...
var array = queue.ToArray();
(ваш метод ToArray - уберите)
1
25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193
03.05.2017, 14:55  [ТС]
Storm23,
C#
1
2
3
4
5
6
7
public T[] ToArray()
        {
            T[] arr = new T[count];
            for (int i = 0; i < count; i++)
                arr[i] = items[i];
            return arr;
        }
Получил, что хотел =)
После прочитал ваше сообщение)

Добавлено через 5 минут
Storm23, Может подскажете, попробовал свой вариант и то, что вы написали, в моем случае процессор практически не работает. В вашем нагружает до 40%. От чего это может быть?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
03.05.2017, 15:06
Цитата Сообщение от timur-chak Посмотреть сообщение
Получил, что хотел =)
Обратите внимание что LimitedQueue реализует интерфейс IEnumerable. Соответственно для него работают все методы из LINQ и для него работает оператор foreach.
Кроме того, явное преобразование в массив - навряд ли вам нужно.

Цитата Сообщение от timur-chak Посмотреть сообщение
В вашем нагружает до 40%. От чего это может быть?
может быть из-за неправильного тестирования
может быть из-за того что компилируете в debug а не в release (по CTRL-F5)
ну а может быть и LINQ тормозит. LINQ не самый производительный вариант. Если нужна большая производительность - пишите свои методы. И в вашем случае - лучше использовать Array.Copy вместо цикла.

Добавлено через 8 минут
Хотя нет, Array.Copy там использовать нельзя.
Правильный метод будет выглядеть так:
C#
1
2
3
4
5
6
7
8
9
10
        public T[] ToArray()
        {
            var res = new T[count];
            var l = items.Length;
 
            for (int i = 0; i < res.Length; i++)
                res[i] = items[(start - i + l) % l];
 
            return res;
        }
1
25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193
18.05.2017, 16:43  [ТС]
Storm23, только сейчас осознал, что немного не так, как я хотел это работает, ибо нужно добавлять элементы не в начало, а в конец, смещая начало.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
18.05.2017, 17:17
Цитата Сообщение от timur-chak Посмотреть сообщение
нужно добавлять элементы не в начало, а в конец, смещая начало.
Не очень понял. А какая разница? И кроме того вообще то в очереди как раз элементы добавляются в конец, а смещается начало, как вы и хотите. Возможно вы имеет ввиду, что вам нужны элементы в обратном порядке? Тогда можете воспользоваться методом Reverse из LINQ. Ну или переписать цикл в методе GetEnumerator() в обратную сторону.
0
25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193
18.05.2017, 18:45  [ТС]
Storm23, Я немного не понимаю, вот что я хочу на примере списка. При превышение размера. Добавляем новый элемент и при этом удаляем нулевой. Как-то так.

Добавлено через 13 минут
на примере List, т.е..
C#
1
2
3
List.add(item);
if(List.count>capasity)
   List.RemoveAt(0);
Добавлено через 24 минуты
Storm23, Как я понял, что при переполнение размерности, start обнуляется и данные новые попадают в начало массива. Или я все же не прав?(
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
18.05.2017, 18:57
timur-chak, Сорри я вас не понимаю, вы хотите странного.
0
25 / 25 / 15
Регистрация: 17.04.2011
Сообщений: 193
18.05.2017, 19:23  [ТС]
Storm23, Пример того, что я хочу =)

Добавлено через 20 минут
Storm23, Возможно я у вызываю у вас кровь из глаз. Но вы все равно помогли мне осознать, чего я сам хочу. Сделал подобное:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[Serializable]
    public class LimitedQueue<T> : Queue<T>
    {
        private int? maxCapacity { get; set; }
 
        public LimitedQueue() { maxCapacity = null; }
        public LimitedQueue(int capacity) { maxCapacity = capacity; }
 
        public void Add(T newElement)
        {
            if (this.Count == (maxCapacity ?? -1)) this.Dequeue();
            this.Enqueue(newElement);
        }
        public void AddRange(T[] arr)
        {
            foreach (var i in arr)
                Add(i);
        }
 
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.05.2017, 19:23
Помогаю со студенческими работами здесь

Блок схема для алгоритма: Оптимизация маршрута для перевозки товаров
Кто-нибудь может составить примерно хотя бы блок схему для следующего алгоритма? оптимизация маршрута для перевозки товаров. Алгоритм: ...

Программа для сравнения производительности необобщенного алгоритма ArrayList и обобщенного алгоритма List
Доброе время суток форумчане! Наткнулся я в книжке на этот код, решил проверить у себя, и получилось так, что код написан с ошибками в: ...

Вычисление НОД с помощью бинарного алгоритма и алгоритма Евклида.
Решил заняться программированием, друг посоветовал язык C# и дал задачу: Сделать алгоритм для вычисления НОД с помощью бинарного...

Оптимизация алгоритма
Добрый день. Написал код на C#, для вычисления, к примеру 2^(1 000 000 000). Ясно, что работа с BigInteger. Код работает, для числа, к...

Оптимизация алгоритма
Всем привет. Если кто-то сможет оптимизировать &quot;это&quot;, то я отблагодарю его материально. uint32_t a0 = ps*26 + ps*51 + ps*102 + ps*51 +...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru