为什么函数使用完整数组比使用空函数更快

时间:2015-04-14 14:52:43

标签: javascript arrays performance v8

我有两个函数实现,它获取数组的最后一个元素。

function first(array) {
  var length = array ? array.length : 0;
  return length ? array[length - 1] : undefined;
}

function second(array) {
  return array ? array[array.length - 1] : undefined;
}

第二个函数使用完整数组比第一个快,但慢慢地用空。为什么以及如何解决它?

使用完整数组的基准:http://jsperf.com/lodash-f-last/

空数组的基准: http://jsperf.com/lodash-f-last/2

3 个答案:

答案 0 :(得分:4)

如果你希望你的代码快速,你永远不应该读出界限:V8 去优化执行该操作的代码。

在你second函数中你正是这样做的 - 你读出了界限。而是在阅读之前检查边界:

function xlast(array) {
  return (array && array.length > 0) ? array[array.length - 1] 
                                     : undefined;
}

答案 1 :(得分:3)

对我而言,似乎第二函数使用完整数组更快,因为您不必像第一个函数那样执行var length = array ? array.length : 0;为您节省额外的三元条件。

使用空数组但是,第二函数较慢,因为您被迫执行arr[-1](因为空数组仍然提供true if if)这是一个getter函数,在第一个函数中,条件是if (0),这是假的,你只需返回undefined。

关于你的第二个问题 - 如何解决它 - 我认为这样做会有效,因为它会为你节省getter功能:

function second(array) {
  return array && array.length ? array[array.length - 1] : undefined;
}

答案 2 :(得分:2)

如果是空数组,则可能是数组查找的成本,因为您的算法在零长度时表现不同,请注意?运算符的控制变量:

function first(array) {
  var length = array ? array.length : 0;
  return length ? array[length - 1] : undefined;
}

通过评估?:construct 的右侧为[] 返回undefined,因为0的计算结果为false。

另一方面,

function second(array) {
  return array ? array[array.length - 1] : undefined;
}

从评估数组[-1] 返回[] 的undefined,因为[]的计算结果为true。

如果是完整阵列,第二个算法简单易行。