簡體   English   中英

處理大量數字時功能會變慢

[英]Function slows down when working with high numbers

我編寫了一個腳本,而不是給出一組數據的真實平均值,而是返回一個包含大多數數據點的窗口。 讓我顯示一些代碼:

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()是附加到Array的原型。 但這一切進行得非常快。 我已經測量了每個步驟,並且for循環變慢了。

我想到您的問題有兩件事:

  1. 刪除了不必要的/重復的計算

在嵌套代碼中,每次都為minValueistep的相同值計算minValue+(i-1)*stepminValue+i*step step 您應該在第二個for循環之前將其上拉:

var dataPointCount = 0;
var lowerLimit = minValue+(i-1)*step;
var higherLimit = minValue+1*step;
for (var j = 0; j < myArray.length; j++) {
    if (myArray[j] >= lowerLimit && myArray[j] <= higherLimit) {
        dataPointCount++;
    }
}
  1. 當您處理大數據陣列時,可能會由於內存交換而導致性能嚴重下降。 從您的角度來看,您正在處理單個數組實例,但是,當您擁有如此大的數組時,JavaScript VM不太可能訪問連續的內存空間來保存所有這些值。 JavaScript VM很可能必須處理從操作系統中獲得的多個內存塊,並且必須花費額外的精力來轉換在讀/寫期間哪個值在哪里。

如果我正確理解了您的算法,這應該刪除所有不必要的計算,並且速度要快得多:

var arr = [];
var maxQty=0;
var wantedAverage = 0;
for (var j = 0; j < 11; j++) {
    arr[j]=0;
}
for (var j = 0; j < myArray.length; j++) {
    var stepIndex = Math.floor((myArray[j]-minValue)/step)
    arr[stepIndex]+=1;

    if(arr[stepIndex] > maxQty ){
        wantedAverage = minValue + stepIndex*step +Math.round(0.5*step);
        maxQty = arr[stepIndex]
    }
}
console.log(maxQty, wantedAverage)

我們只對數組的每個元素進行一次迭代,然后計算它所屬的窗口的索引,將一個添加到數量數組。 然后,如果我們在窗口中發現了更多的點,我們將更新wantedAverage

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM