我一直在努力优化一些代码,所以事情要快一些,只是想要解释一下我找到的东西。
代码只是计算特定窗口的值。所以我们有这个片段,通过查看原始数组中的值来计算它
当用户选择完成计算的窗口时,设置开始时间和结束时间。然后计算查看这些时间之间的原始数据数组并进行计算。请注意,数据字典中的数组非常大。
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。 :)
答案 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))