【发布时间】:2015-11-02 19:20:45
【问题描述】:
我编写了一个脚本,它不会给出一组数据的实际平均值,而是返回一个包含大多数数据点的窗口。让我展示一些代码:
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 循环变慢了。
【问题讨论】:
-
不确定步骤是什么?
-
如果没有看到更多代码,很难判断代码应该做什么,但问题与嵌套循环有关,它看起来就像代码是做的工作比它应该做的多得多。
-
当然,您可以只遍历数组一次并以数字方式确定每个值所在的“步长”。无需为每个间隔一遍又一遍地搜索整个数组.
-
好点我可以改变这个。但我的具体问题是为什么某些数组在 ±0.5 毫秒内计算,而其他数组(长度相同但数字很大)可能需要长达 10 秒。
-
@SecondLemon 只需将
for (var i = 1更改为for (var i = minValue并查看差异。
标签: javascript performance loops average