2010-06-27 72 views
4

我刚刚收到一份代码交给了我。代码是用C#编写的,它每秒钟将实时数据插入到数据库中。数据在时间上累积,使数字变大。这个代码如何进一步优化?

数据在第二多次内更新,然后在第二个结果的末尾插入。

我们通过属性直接在第二个数据集行中寻址数据集。例如像这样的许多操作'datavaluerow.meanvalue + = mean;可能发生。 我们发现在执行内部转换之后,运行profiler的性能会降低性能,所以我们创建了2d数组进行更新,然后仅在第二个数据结束时将值分配给数据行。 我运行了一个分析器,发现它仍然花费很多时间(尽管比添加时经常访问数据行的时间少)。

是在第二的端exectued的代码如下

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    
} 

是否有进一步改进这种方法的一种方式。

+0

你的分析显示大部分时间在哪里? – Oded 2010-06-27 08:51:11

+0

将cast(int)table1Enum.barDateTime带出循环。 – 2010-06-27 08:51:25

+0

@ Oded,大部分时间都在铸造操作中花费 – mustafabar 2010-06-27 09:01:31

回答

4

一个显而易见的问题:当你只用整数更新它们时,为什么要有二维数组小数?你可以用int[][]代替吗?

接下来,为什么每次迭代访问(int)table1Enum.barDateTime?鉴于有一个转换涉及那里,你可能找到它可以帮助,如果你提取出循环。

但是,我怀疑大部分时间都将花费在_table1Values[i].Cast<object>().ToArray()。你真的需要这样做吗?取一份decimal[](或int[])的副本会比每次调用时在每次迭代中装入每个值都快,然后再创建另一个数组。

+0

我们正在考虑将小数更改为uint,当然这会提高内存利用率和性能。然而,在将小数转换为对象时需要花费时间。 ItemArray是对象类型的。如何更新数据行而不用这样做 – mustafabar 2010-06-27 09:13:15

+1

@Mustafa:仅仅因为'ItemArray'是'object'类型并不意味着你必须有一个对象*数组*。任何数组都是一个对象本身。你需要考虑是否要复制阵列,请注意。 – 2010-06-27 09:15:34

+0

仍在复制阵列正在进行同一时间。事情是这条线平均需要20毫秒,但我们正在重复这个过程为其他表,这是结束了大约300毫秒!在我们的数据中延迟非常关键。我发现这个过程是一个很大的瓶颈 – mustafabar 2010-06-27 10:03:00