Javascript 为什么函数在满数组中比在空数组中工作得更快

Javascript 为什么函数在满数组中比在空数组中工作得更快,javascript,arrays,performance,v8,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; } 第二个函数处理满数组的速度比第一个快,但处理空数组的速度慢

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

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;
}
第二个函数处理满数组的速度比第一个快,但处理空数组的速度慢。为什么以及如何修复它

完整阵列的基准测试:

具有空数组的基准:

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

function first(array) {
  var length = array ? array.length : 0;
  return length ? array[length - 1] : undefined;
}
通过计算?:构造的右侧返回未定义的[],因为0的计算结果为false

另一方面,

function second(array) {
  return array ? array[array.length - 1] : undefined;
}
从求值数组[-1]
返回未定义的[],因为[]求值为true


对于完整数组,第二个算法要简单得多。

对我来说,使用完整数组时,second函数的速度要快得多,因为您不必执行
var length=array?数组长度:0与第一个函数类似,这为您节省了一个额外的三元条件

但是,对于空数组第二个函数的速度要,因为您必须执行
arr[-1]
(因为空数组仍然在if内部提供true),这是一个getter函数,而在第一个函数中,条件是
if(0)
为false,您只需返回undefined

至于你的第二个问题——如何修复它——我认为这会起作用,因为它将为你节省getter函数:

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

如果你想让你的代码速度更快,你就永远不应该读越界:V8会对代码进行去优化

在你的
second
函数中,你正是这样做的——你的读数超出了范围。而是在读取之前进行边界检查:

函数xlast(数组){
返回(array&&array.length>0)?数组[array.length-1]
:未定义;
}

如果用你的意思替换“更好”和“不好”,你的问题会更简洁。我想你的意思是“快”和“慢”?我只是对第二个函数很好奇。空数组仍然是数组,对吗?这意味着
array?
将为true,因此将返回array[-1],还是我错了?@elijahlyn噢,对不起,我更新了question@Doodlebunch嗯,否-
if([])console.log('hi')
gives
hi
@Doodlebunch似乎是空的是真的:@PavelGatnar是可以写的,但我们正在进入一个微优化领域。我怀疑这个“位”是否会被注意到。@PavelGatnar实际上,您当前评论中的这个版本不太可能提供任何好处-首先,您不能执行
数组。在检查
数组
是否定义之前,请先检查长度
,然后再检查现代引擎是否能够应用公共子表达式消除(CSE)到
array.length
自身。抱歉,这是我更正的函数:
函数xlast(array,len){返回数组&&(len=array.length)→数组[--len]:未定义}