【问题标题】:How can this code be further optimized?如何进一步优化这段代码?
【发布时间】:2010-06-27 08:43:49
【问题描述】:

我刚刚收到了一个代码。该代码是用 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            
}

有没有办法进一步改进这种方法。

【问题讨论】:

  • 您的分析表明您在哪里花费的时间最多?
  • 将强制转换 (int)table1Enum.barDateTime 退出循环。
  • @Oded,大部分时间都花在了铸造操作上

标签: c# performance variable-assignment datarow


【解决方案1】:

一个明显的问题:为什么你只用整数更新小数的二维数组?你可以改用int[][] 吗?

接下来,为什么每次迭代都访问(int)table1Enum.barDateTime?鉴于其中涉及转换,您可能会发现如果将其从循环中提取出来会有所帮助。

但是,我怀疑大部分时间将花在_table1Values[i].Cast&lt;object&gt;().ToArray() 上。你真的需要这样做吗?复制decimal[](或int[])比在每次调用的每次迭代中对每个值都装箱更快,然后创建另一个数组。

【讨论】:

  • @Mustafa:仅仅因为ItemArrayobject 类型并不意味着你必须有一个对象array。任何数组本身就是一个对象。请注意,您需要考虑是否获取数组的副本。
  • @Mustafa:你真的需要复制数组吗?这是我无法告诉你的——对于你的特定程序来说,你是否本质上每行有一个数组并直接修改它,或者它是否总是必须是一个独立的副本?
  • @Mustafa:目前您正在为每个数组创建一个副本,并将对该副本的引用设置为ItemArray。另一种方法是将ItemArray 设置为直接引用原始数组。通过ItemArraytable1Values 可以看到数组中的更改。正如我所说,我对您与他们一起做的事情了解得不够多,不知道这是否会奏效。
  • @Mustafa:我不确定这与是否需要复制的问题有什么关系。
  • @Mustafa:我不建议使用对象数组。我建议(根据我的第二条评论)使用 int[]decimal[] 数组。
猜你喜欢
  • 1970-01-01
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 2016-01-01
  • 1970-01-01
相关资源
最近更新 更多