将Math.max与类型化子数组一起使用

问题描述

我有一个填充了值的类型化数组。

我正在尝试找出在给定边界内计算这些值的最大值和最小值的最快方法

因此,例如,我有3200个值,并且我想知道索引342和934之间的范围的最大值,边界范围可以更改,并且可以从1000个值变化到上万个。

我认为这样的方法会起作用:

const a = new Uint8Array([10,60,5,90,110,3,45,1,24,54,29]);
Math.max(...a.subarray(5,7)); // Returns 45.

但是据我所记得,散布运算符非常慢。

我实际上认为Math.max函数也需要一个数组,但是使用了

Math.max(a.subarray(5,7));

返回NaN

有人对获得任何给定范围的最大值的最有效方式有想法吗?我特别希望在大视野下获得高性能

解决方法

Math.max接受任意数量的参数,因此您可以使用Math.max.apply(请参阅Function.prototype.apply)将其传递给数组:

const a = new Uint8Array([10,60,5,90,110,3,45,1,24,54,29]);
var max = Math.max.apply(null,a.subarray(5,7));
console.log(max);

但是绝对最快的似乎是:

const a = new Uint8Array([10,29]);
var sa = a.subarray(5,7);
var max = -Infinity;
for(var i=0;i<sa.length;i++)
   if(sa[i] > max) max = sa[i];
console.log(max);

基准测试结果:https://jsbench.me/92kfgj7ldx/1

,

这是您可以使用的替代方法。

const a = new Uint8Array([10,29]);
Math.max.apply({},7));

我尝试在jsbench上运行基准测试,结果如下:

code block 1 (1404013)

code block 2 (1695631)

这是根据specs

进行申请的方式