如何进一步优化这段代码?

4
我刚刚拿到了一份代码。该代码使用C#编写,每秒将实时数据插入数据库。由于数据在时间上累积,因此数字会变得很大。
数据在一秒内多次更新,然后在结束时取结果并插入。
我们曾经直接通过属性在第二个数据集行中进行操作。例如,很多操作像这样'datavaluerow.meanvalue += mean;'可以发生。 我们发现,由于内部转换的原因,这会降低性能,因此我们创建了一个十进制的2D数组,在其中进行更新,然后仅在第二个结尾时将值分配给数据行。 我运行了分析器,发现它仍然需要很长时间(虽然比经常访问数据行时花费的时间少)。
在第二个结束时执行的代码如下:
public void UpdateDataRows(int tick)
{
  //ord
  //_table1Values is of type decimal[][]
  for (int i = 0; i < _table1Values.Length; i++)
  {
    _table1Values[i][(int)table1Enum.barDateTime] = tick;
    table1Row[i].ItemArray = _table1Values[i].Cast<object>().ToArray();

  }
  // this process is done for other 10 tables            
}

有没有办法进一步改善这种方法?

你的分析显示最耗时的部分在哪里? - Oded
将 (int)table1Enum.barDateTime 的转换放到循环之外。 - Pavel Radzivilovsky
@ Oded,大部分时间都花在了转换操作上。 - mustafabar
1个回答

4
一个明显的问题是:当你只使用整数进行更新时,为什么要有一个十进制的二维数组?你能不能用int[][]代替呢?
接下来,为什么在每次迭代中都要访问(int)table1Enum.barDateTime?考虑到这里涉及到了一次转换,如果你将其提取出循环,或许会更有帮助。
然而,我怀疑大部分时间都会花费在_table1Values[i].Cast<object>().ToArray()上。你真的需要那样做吗?复制decimal[](或int[])会比在每次调用时对每个值进行装箱再创建另一个数组更快。

1
@Mustafa:仅仅因为 ItemArrayobject 类型,并不意味着你必须要有一个对象 数组。任何数组本身都是一个对象。但需要考虑是否需要复制该数组。 - Jon Skeet
1
@Mustafa:你真的需要复制这个数组吗?这是我无法告诉你的——对于你的特定程序来说,是否重要,你每行基本上都有一个数组,并直接修改它,还是它总是必须是独立的副本? - Jon Skeet
1
@Mustafa:目前你正在创建每个数组的一个副本,并将引用设置为 ItemArray。另一种选择是直接将 ItemArray 设置为引用原始数组。 数组中的更改将通过 ItemArraytable1Values 可见。就像我说的,我不知道你对它们做了什么,无法确定那种方式是否可行。 - Jon Skeet
1
@Mustafa:我不确定这与是否需要复制有关的问题有什么相关性。 - Jon Skeet
1
@Mustafa:我并不建议使用对象数组。正如我在第二条评论中所建议的那样,使用int[]decimal[]数组。 - Jon Skeet
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接