Оптимизация алгоритма - C# (178406)
Формулировка задачи:
День добрый, хочу обратится за советом. Имею следующее. Получаю данные в 4-ре List<double> (как не важно).
signal_input1(2,3,4). Данные поступают в реальном времени постоянно. Формируется "окно" для так называемой предыстории, что бы по нажатию пользователем на кнопку "Запись" к началу записи будет предыстория. Формирование предыстории выглядит так:
Так же имеются 4-графика ZedGraph в которые вывожу данные для наглядности. Принцип примерно такой же, как и выше.
В момент формирование полного окна, когда срабатывает первое условие if (signal_input1.Count > l). Процессор очень сильно нагружается, скажем так, заметно выше, чем обычно. Вопрос в том, как можно упростить данную задачу? =) Буду рад любым подсказкам, т.к. опыта у меня мало пока.
Листинг программы
- 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);
- }
Листинг программы
- 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);
- }
Решение задачи: «Оптимизация алгоритма»
textual
Листинг программы
- [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();
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д