我寫了一個腳本,它不是給出一組數據的實際平均值,而是返回一個包含大多數數據點的窗口。讓我告訴一些代碼:使用高數字時函數速度變慢
time.tic()
var selectedAverage = 0;
var highestPointCount = 0;
for (var i = 1; (i*step) <= maxValue; i++) {
var dataPointCount = 0;
for (var j = 0; j < myArray.length; j++) {
if (myArray[j] >= minValue+(i-1)*step && myArray[j] <= minValue+i*step) {
dataPointCount++;
}
}
if (dataPointCount > highestPointCount) {
highestPointCount = dataPointCount;
selectedAverage = (minValue+(i-1)*step)+Math.round(0.5*step);
}
}
console.log(time.toct().ms)
return selectedAverage;
首先步進值是通過從最大值減去最小值,然後由10決定所以有10個「水平」窗口來計算。然後腳本計算每個窗口內數據點的數量並返回適當的平均值。
但是,當傳遞一個數字較大的數組(例如1.000.000)時,腳本會顯着減慢(有時超過200次)。數組長度大致爲200,但始終長度相同,因此它必須與實際值相關聯。任何想法哪裏出錯?
編輯: 的代碼來獲得步長值:
var minValue = myArray.min();
var maxValue = myArray.max();
var step = Math.round((maxValue-minValue)/10);
if (step === 0) {
step = 1
}
的.min()和的.max()是附接至陣列原型。但這一切都非常快。我已經測量了每一步,並且它是減慢的for循環。
不確定步驟是什麼? – juvian
沒有看到更多的代碼,很難說代碼應該做什麼,但問題與嵌套循環有關,它看起來像代碼做的工作比應該做的要多得多。 – Pointy
當然你可以遍歷數組** **一次**,並在數值上確定每個值所處的「步長」。不需要一遍又一遍地搜索整個數組。 – Pointy