Оптимизация алгоритма - 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(); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д