为什么更改if条件的位置会加快我的程序?

时间:2018-03-02 08:56:41

标签: javascript time

我编写了一个带有两个循环的排序算法(插入排序)但是我发现当第二个循环的条件是

  

j> 0&&价值< inputArray [j - 1]

循环比条件

时运行得更快
  

值< inputArray [j - 1]&& j> 0

这是由我的计算机上的Node.JS编写和运行的。

const makeEmptyArrayOfSize = function(targetArray, targetSize){
  console.time('ArrayMakingTime')
  for(let i = 0;i<targetSize;i++){
    targetArray.push(Math.floor(Math.random() * targetSize))
  }
  console.timeEnd('ArrayMakingTime')
  return targetArray
}
const slowerSort = (inputArray) => {
  console.time('slowerSort for ' + inputArray.length + ' records')
  for(let i = 0;i<inputArray.length;i++){
    let value = inputArray[i]
    let j = i
    for(;value < inputArray[j - 1] && j > 0;j--){
      inputArray[j] = inputArray[j - 1]
    }
    inputArray[j] = value
  }
  console.timeEnd('slowerSort for ' + inputArray.length + ' records')
  return inputArray
}
const fasterSort = (inputArray) => {
  console.time('fasterSort for ' + inputArray.length + ' records')
  for(let i = 0;i<inputArray.length;i++){
    let value = inputArray[i]
    let j = i
    for(;j > 0 && value < inputArray[j - 1];j--){
      inputArray[j] = inputArray[j - 1]
    }
    inputArray[j] = value
  }
  console.timeEnd('fasterSort for ' + inputArray.length + ' records')
  return inputArray
}
let dummyArray = makeEmptyArrayOfSize([], 10000)
let dummyArrayCopy = dummyArray.slice(0)
slowerSort(dummyArray)
fasterSort(dummyArrayCopy)

正如您在上面的代码段中所看到的,fastSort和slowSort之间的唯一区别是 AND (&amp;&amp;)条件在第二个 for 循环中的位置然而,他们评估时间上的巨大差异。

1 个答案:

答案 0 :(得分:0)

我可以看到两件事正在发挥重要作用:

1)在较慢的版本中,只需更改一些代码,例如

let m = inputArray[j - 1];
for (; value < m && j > 0; j--) {
  inputArray[j] = m
}

现在您会发现结果有所不同.JavaScript数组与我们在服务器端语言(如c#)中看到的不同,其中从数组中读取的是O(1),在JavaScript数组中只是对象的扩展

2)注释中提到的另一个是短路评估