簡體   English   中英

相同的代碼比JS閉包庫慢

[英]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.

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