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

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

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

День добрый, хочу обратится за советом. Имею следующее. Получаю данные в 4-ре List<double> (как не важно). signal_input1(2,3,4). Данные поступают в реальном времени постоянно. Формируется "окно" для так называемой предыстории, что бы по нажатию пользователем на кнопку "Запись" к началу записи будет предыстория. Формирование предыстории выглядит так:
                    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 в которые вывожу данные для наглядности. Принцип примерно такой же, как и выше.
                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). Процессор очень сильно нагружается, скажем так, заметно выше, чем обычно. Вопрос в том, как можно упростить данную задачу? =) Буду рад любым подсказкам, т.к. опыта у меня мало пока.

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

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();
        }
    }

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


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

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

13   голосов , оценка 3.923 из 5
Похожие ответы