Оптимизация алгоритма - 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();
}
}