Оптимизация алгоритма - C# (178406)

Узнай цену своей работы

Формулировка задачи:

День добрый, хочу обратится за советом. Имею следующее. Получаю данные в 4-ре List<double> (как не важно). signal_input1(2,3,4). Данные поступают в реальном времени постоянно. Формируется "окно" для так называемой предыстории, что бы по нажатию пользователем на кнопку "Запись" к началу записи будет предыстория. Формирование предыстории выглядит так:
Листинг программы
  1. int l = Convert.ToInt32(Setting.getWin() * Setting.getFs());
  2. if (signal_input1.Count <l)
  3. {
  4. progressBar2.Invoke(new Action(() => progressBar2.Value=(signal_input1.Count * 100) / l));
  5. }
  6. if (signal_input1.Count > l)
  7. {
  8. progressBar2.Invoke(new Action(() => progressBar2.Value = 100));
  9. signal_input1 = signal_input1.GetRange(signal_input1.Count - l, l);
  10. signal_input2 = signal_input2.GetRange(signal_input2.Count - l, l);
  11. signal_input3 = signal_input3.GetRange(signal_input3.Count - l, l);
  12. signal_input4 = signal_input4.GetRange(signal_input4.Count - l, l);
  13. }
Так же имеются 4-графика ZedGraph в которые вывожу данные для наглядности. Принцип примерно такой же, как и выше.
Листинг программы
  1. signal_drow1.AddRange(signal_input1.ToArray());
  2. signal_drow2.AddRange(signal_input2.ToArray());
  3. signal_drow3.AddRange(signal_input3.ToArray());
  4. signal_drow4.AddRange(signal_input4.ToArray());
  5. if (signal_drow1.Count>count)
  6. {
  7. signal_drow1= signal_drow1.GetRange(signal_drow1.Count - count, count);
  8. }
  9. if (signal_drow2.Count > count)
  10. {
  11. signal_drow2 = signal_drow2.GetRange(signal_drow2.Count - count, count);
  12. }
  13. if (signal_drow3.Count > count)
  14. {
  15. signal_drow3 = signal_drow3.GetRange(signal_drow3.Count - count, count);
  16. }
  17. if (signal_drow4.Count > count)
  18. {
  19. signal_drow4 = signal_drow4.GetRange(signal_drow4.Count - count, count);
  20. }
В момент формирование полного окна, когда срабатывает первое условие if (signal_input1.Count > l). Процессор очень сильно нагружается, скажем так, заметно выше, чем обычно. Вопрос в том, как можно упростить данную задачу? =) Буду рад любым подсказкам, т.к. опыта у меня мало пока.

Решение задачи: «Оптимизация алгоритма»

textual
Листинг программы
  1.     [Serializable]
  2.     public class LimitedQueue<T> : IEnumerable<T>
  3.     {
  4.         T[] items;
  5.         int start = 0;
  6.         int count = 0;
  7.  
  8.         public LimitedQueue(int capacity)
  9.         {
  10.             items = new T[capacity];
  11.         }
  12.  
  13.         public void AddRange(IEnumerable<T> items)
  14.         {
  15.             foreach (var item in items)
  16.                 Enqueue(item);
  17.         }
  18.  
  19.         public void Enqueue(T item)
  20.         {
  21.             items[start] = item;
  22.             count++;
  23.             if (count >= items.Length)
  24.                 count = items.Length;
  25.             start = (start + 1) % items.Length;
  26.         }
  27.  
  28.         public T Dequeue()
  29.         {
  30.             if (Count == 0)
  31.                 throw new Exception("Queue is empty");
  32.  
  33.             count--;
  34.             start = (start - 1 + items.Length) % items.Length;
  35.             return items[start];
  36.         }
  37.  
  38.         public T Peek()
  39.         {
  40.             if (Count == 0)
  41.                 throw new Exception("Queue is empty");
  42.  
  43.             if (start == 0)
  44.                 return items[items.Length - 1];
  45.             else
  46.                 return items[start - 1];
  47.         }
  48.  
  49.         public int Count
  50.         {
  51.             get
  52.             {
  53.                 return count;
  54.             }
  55.         }
  56.  
  57.         public void Clear()
  58.         {
  59.             start = 0;
  60.             count = 0;
  61.         }
  62.  
  63.         public IEnumerator<T> GetEnumerator()
  64.         {
  65.             for (int i = 0; i < count; i++)
  66.                 yield return items[(start - i + items.Length) % items.Length];
  67.         }
  68.  
  69.         IEnumerator IEnumerable.GetEnumerator()
  70.         {
  71.             return GetEnumerator();
  72.         }
  73.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы