Javascript 相同的代码比等效的JS闭包库慢

Javascript 相同的代码比等效的JS闭包库慢,javascript,optimization,google-closure-library,Javascript,Optimization,Google Closure Library,我想创建一个经过一些修改的二进制搜索算法。因此,我从谷歌的闭包库中获取了代码,并开始进行这些修改。我的修改版本似乎比它应该慢,所以我慢慢地拿出任何我认为可能会影响速度的东西。留给我的是一个更简单的二进制搜索算法版本,在Chrome或firefox中仍然慢了好几倍。这可能是什么原因造成的?看看这个测试页面。检查来源,看看我在说什么 这是谷歌的版本 goog.array.binarySearch_ = function(arr, compareFn, isEvaluator, opt_target

我想创建一个经过一些修改的二进制搜索算法。因此,我从谷歌的闭包库中获取了代码,并开始进行这些修改。我的修改版本似乎比它应该慢,所以我慢慢地拿出任何我认为可能会影响速度的东西。留给我的是一个更简单的二进制搜索算法版本,在Chrome或firefox中仍然慢了好几倍。这可能是什么原因造成的?看看这个测试页面。检查来源,看看我在说什么

这是谷歌的版本

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;
};
goog.array.binarySearch=函数(arr、compareFn、isEvaluator、opt_目标、,
opt_selfObj){
var left=0;//包含
var right=arr.length;//独占
var发现;
while(左<右){
var middle=(左+右)>>1;
var比较结果;
if(isEvaluator){
compareResult=compareFn.call(opt_selfObj,arr[middle],middle,arr);
}否则{
compareResult=compareFn(选择目标,arr[middle]);
}
如果(比较结果>0){
左=中+1;
}否则{
右=中;
//我们正在寻找最低指数,因此无法立即返回。
found=!compareResult;
}
}
//左侧是索引(如果找到),否则为插入点。
//~left是-left-1的缩写。
找到返回?左:~左;
};
这是我的版本:

        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;
        };
var search=函数(数组,num){
var left=0;//包含
var right=array.length;//独占
while(左<右){
var middle=(左+右)>>1;
var midValue=数组[midValue];
如果(数值>中值){
左=中+1;
}否则{
右=中;
}
}
左转;
};
由于人们似乎认为它与comparefn函数有关……当您不向binarySearch方法提供comparer函数时,它使用以下默认比较函数:

    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);
};
goog.array.defaultCompare=函数(a,b){
返回a>b1:a

请不要不看代码就回答。猜测没有多大帮助。

您的实现包含一个bug。它包括:

var midValue = array[midValue]
应该是哪一个

var midValue = array[middle]
相反


显然,您的数据集没有将错误暴露为不正确的结果,而是暴露为性能问题,这是非常不幸的

试着发布一个演示来展示性能上的差异Google代码是从
compareFn
获取数据的,它用来设置左或右,你的代码是从数组获取数据的,有些东西告诉我你的代码在while循环中进行了更多的迭代。在循环中放置一个计数器,查看它在每个while循环中运行的次数。@adeneo compareFn仅返回1或0,具体取决于该数字是否大于或小于中间值。我只是将数字与中间值direclty进行比较代码非常简单,如果您的版本比Google的版本慢很多,则最有可能是while循环进行了更多的迭代,唯一的方法是如果比较的数据不同。您必须以某种方式对此进行调试。我猜是对compareFn方法的调用,这些方法返回的结果允许CompareResult向左递增。因此在返回时速度更快。天哪,谢谢!!!我不敢相信这是如此愚蠢的错误!我从来没有检查过它是否返回了正确的索引!我检查以确保数组被准确排序,但这没有告诉我任何事情,因为我甚至没有使用我的搜索算法进行排序。啊!