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

标签 javascript optimization google-closure-library

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

https://dl.dropboxusercontent.com/s/4hhuq4biznv1jfd/SortedArrayTest.html

这是谷歌的版本。

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]

相反。

显然,您的数据集没有将错误暴露为不正确的结果,而只是作为性能问题。

关于javascript - 相同的代码比等效的 JS 闭包库慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26965254/

相关文章:

javascript - JQuery REST 调用不起作用

python - 对 MongoDB 实例中的每个文档执行操作

javascript - 使用 jQuery 检查页面加载时的所有复选框

javascript - 在 javascript 中指定对象文字内属性的不同方法

sql - 什么是最优? UNION vs WHERE IN (str1, str2, str3)

c# - 只调用另一个方法的方法的编译器优化

javascript - jQuery .toggle() 等同于 Google Closure

javascript - 我们可以使用谷歌闭包创建一个带有复选框和组合框的对话框吗

google-closure-compiler - 为什么 "Hello World"plovr 示例中出现 JSC_MISSING_PROVIDE_ERROR?

javascript - HTML5 数字输入 - 显示为百分比而不是小数