计算大阵列的一部分与复制块和计算

时间:2015-02-09 14:48:19

标签: arrays vb.net loops

我一直在努力优化一些代码,所以事情要快一些,只是想要解释一下我找到的东西。

代码只是计算特定窗口的值。所以我们有这个片段,通过查看原始数组中的值来计算它

当用户选择完成计算的窗口时,设置开始时间和结束时间。然后计算查看这些时间之间的原始数据数组并进行计算。请注意,数据字典中的数组非常大。

Dim Calc As Dictionary(Of String, Double) = New Dictionary(Of String, Double)
Dim data As Dictionary(Of String, Double()) = New Dictionary(Of String, Double())

 Dim total As Double = 0
 For r = starttime To endtime
    total = total + Math.Pow(data(key)(r), 2)
 Next
 Calc.Add(key, Math.Sqrt(total / length))

然后有一种方法,当一次大约50次计算时,结果快了近100ms。在这里,它将那些特定时间的块复制到另一个数组,然后进行计算

Dim temp(length) As Double
Array.Copy(data(key), starttime, temp, 0, starttime-endtime)
Calc.Add(val, Func(temp))

 Private Function Func(arr As Double()) As Double
    Dim total As Double = 0
    For Each value In arr 
        total = total + Math.Pow(value, 2)
    Next
    Return Math.Sqrt(total / arr.Length)
End Function

我认为复制阵列所增加的时间会导致它落后?我仍然试图提高效率,所以任何进一步的建议都会非常感激:)

编辑:做了一些研究,发现了,取而代之的

Math.Pow(val,2)

val*val

再敲100ms。 :)

1 个答案:

答案 0 :(得分:1)

您应该尝试loop unrolling。基于这两个例子,一个没有数据(密钥)

Dim total As Double = 0
Dim subData As Double() = data(key)

For r = starttime To endtime
   total = total + Math.Pow(subData(r), 2)
Next
Calc.Add(key, Math.Sqrt(total / length))

由于你正在做一个简单的pow2,我建议你在你的函数中做正确的数学运算。

Dim total As Double = 0
Dim value As Double
Dim subData As Double() = data(key)

For r = starttime To endtime
   value = subData(r)
   total += value * value
Next
Calc.Add(key, Math.Sqrt(total / length))

另外,如果你这么做了,你可以将pow2值保存在第二个数组中以备将来使用。

Dim total As Double = 0
Dim subData As Double() = dataThatIsAlreadyPow2(key)

For r = starttime To endtime
   total += subData(r)
Next
Calc.Add(key, Math.Sqrt(total / length))