2015-02-09 54 views
0

我剛剛嘗試優化一些代碼,所以事情有點快,只是想解釋我發現的內容。計算部分大陣列與複製塊和計算

代碼只是計算特定窗口的值。因此,我們通過查看原始數組中的值來計算此代碼段

當用戶選擇完成計算的窗口時,會設置開始時間和結束時間。計算然後查看那些時間之間的原始數據數組並進行計算。快速注意,數據字典內的數組非常大。

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。在這裏copys那些特定的時間到另一個陣列的塊,然後做計算

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 

我認爲,從複製數組中的添加時間會導致它落後?我仍然在努力使這個更有效,所以任何進一步的建議,將不勝感激:)

編輯:做了一些研究發現,與

val*val 

更換

Math.Pow(val,2) 

再敲100ms。 :)

+0

你是什麼意思調整它們?我不相信我正在調整任何陣列的大小? – 2015-02-09 14:53:56

+0

對不起,我誤解了代碼。我認爲我們需要更多的cotext來幫助改進它。但是,改善工作代碼通常屬於http://codereview.stackexchange.com – 2015-02-09 14:55:31

+0

感謝WIll試一試。我只是很好奇爲什麼方法第一要花費超過2。 增加了一點更多的解釋 – 2015-02-09 15:01:02

回答

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,我會建議你做數學題,就在你的功能。另外,如果你這樣做了很多,你可以將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)) 
+1

使用什麼數據(密鑰)更新原始帖子。這是一個有大量雙打的字典。 看看循環展開,它絕對有幫助,謝謝! 不幸的是,我不認爲保存這些值會對我有用,因爲在數組中計算所做的更改經常發生。 – 2015-02-09 15:46:12