【发布时间】:2018-12-12 17:24:38
【问题描述】:
我有一个 Datapoint[] file = new Datapoint[2592000] 数组。这个数组充满了时间戳和随机值。创建它们要花费我 2 秒。但是在另一个函数prepareData(); 中,我正在为另一个数组TempBuffer 准备240 个值。
在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 点,CPU 就会被推到 99% 的性能,而函数需要的时间太长了。
TempBuffer 样本值:
X = 将 UnixTimeStamp 转换为 DateTime 并将 DateTime 转换为 AODate
{X=43285.611087963, Y=23}
文件样本值:
X = Unix时间戳
{X=1530698090, Y=24}
将 tempbuffer 值转换为 AODate 很重要,因为 tempbuffer 数组中的数据显示在 mschart 中。
有没有办法改进我的代码,从而获得更好的性能?
【问题讨论】:
-
您可以在循环之前将
TempBuffer复制到列表中。由于你做了很多突变,它们在列表上会比每次迭代都创建多个新数组要快。 -
不能用列表吗?
标签: c# arrays winforms performance loops