У меня есть массив Datapoint[] file = new Datapoint[2592000]
. Этот массив заполнен временными метками и случайными значениями. Создание их стоит мне как 2s. Но в другой функции prepareData();
я готовлю 240 значений для другого массива TempBuffer
.
В функции prepareData()
я ищу соответствующие значения в массиве file
. Если я не могу найти ничего, я беру метку времени и устанавливаю значение 0, иначе я беру найденное значение + та же метка времени.
Функция выглядит так:
public void prepareData()
{
stopWatch.Reset();
stopWatch.Start();
Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
for (double i = unixTimestamp; unixTimestamp - 240 < i; i--)
{
bool exists = true;
if (exists != (Array.Exists(file, element => element.XValue == i)))
{
TempBuffer = TempBuffer.Skip(1).Concat(new DataPoint[] { new DataPoint(UnixTODateTime(i).ToOADate(), 0) }).ToArray();
}
else
{
DataPoint point = Array.Find(file, element => element.XValue == i);
TempBuffer = TempBuffer.Skip(1).Concat(new DataPoint[] { new DataPoint(UnixTODateTime(i).ToOADate(), point.YValues) }).ToArray();
}
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
}
Теперь проблема в том количестве данных в file
(2'592'000), которое требуется функции за 40 секунд! С меньшими суммами, такими как 10'000, это не проблема и работает нормально и быстро. Но как только я установил размер file
на мои предпочтительные 2'592'000 точек, процессор поднялся до 99% производительности, и функция стала слишком длинной.
Значение примера TempBuffer:
X = преобразовано UnixTimeStamp в DateTime, а DateTime преобразовано в AODate
{X = 43285.611087963, Y = 23}
Пример файла:
X = Unixtimestamp
{X = 1530698090, Y = 24}
Важно, чтобы значения временного буфера были преобразованы в AODate, поскольку данные в массиве временных буферов отображаются в виде диаграммы.
Есть ли способ улучшить мой код, чтобы у меня была лучшая производительность?