[英]Identical code slower than JS closure library equivalent
我想创建一个经过一些修改的二进制搜索算法。 因此,我从Google的封闭库中获取了代码,然后开始进行这些修改。 我的修改版本似乎比应有的速度慢,所以我慢慢取出了我认为可能影响速度的所有内容。 我剩下的是SIMPLER版本的二进制搜索算法,在Chrome或Firefox中,它的运行速度仍然慢了几倍。 是什么原因造成的? 看一下这个测试页面。 检查源,看看我在说什么。
https://dl.dropboxusercontent.com/s/4hhuq4biznv1jfd/SortedArrayTest.html
这是Google的版本。
goog.array.binarySearch_ = function(arr, compareFn, isEvaluator, opt_target,
opt_selfObj) {
var left = 0; // inclusive
var right = arr.length; // exclusive
var found;
while (left < right) {
var middle = (left + right) >> 1;
var compareResult;
if (isEvaluator) {
compareResult = compareFn.call(opt_selfObj, arr[middle], middle, arr);
} else {
compareResult = compareFn(opt_target, arr[middle]);
}
if (compareResult > 0) {
left = middle + 1;
} else {
right = middle;
// We are looking for the lowest index so we can't return immediately.
found = !compareResult;
}
}
// left is the index if found, or the insertion point otherwise.
// ~left is a shorthand for -left - 1.
return found ? left : ~left;
};
这是我的版本:
var search = function(array, num){
var left = 0; // inclusive
var right = array.length; // exclusive
while (left < right) {
var middle = (left + right) >> 1;
var midValue = array[midValue];
if (num > midValue) {
left = middle + 1;
} else {
right = middle;
}
}
return left;
};
由于人们似乎对comparefn函数有所考虑...当您不向binarySearch方法提供比较器功能时,它将使用以下默认比较功能:
goog.array.defaultCompare = function(a, b) {
return a > b ? 1 : a < b ? -1 : 0;
};
goog.array.binarySearch = function(arr, target, opt_compareFn) {
return goog.array.binarySearch_(arr,
opt_compareFn || goog.array.defaultCompare, false /* isEvaluator */,
target);
};
请不要在不看代码的情况下做出回应。 猜测不是很有帮助。
您的实现包含一个错误。 它包含:
var midValue = array[midValue]
应该是
var midValue = array[middle]
代替。
显然,您的数据集很不幸,没有将错误显示为错误的结果,而只是将其显示为性能问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.