浏览器对切片拼接的优化

时间:2019-08-25 03:27:17

标签: javascript optimization

我具有以下2个功能:

//destructive
const getEveryX = (arr, x, offset) => {
    const _arr = [...arr];
    let _arrArr = [];

    if (offset && offset >= arr.length) {
        _arrArr.push(_arr.splice(0, offset));
    }
    while (_arr.length > x) {
        _arrArr.push(_arr.splice(0, x));
    }
    if (_arr.length) {
        _arrArr.push(_arr);
    }
    return _arrArr
}

//copying
const getEveryX2 = (arr, x, offset) => {
    let _pointer = 0;
    const _arrArr = [];

    if (offset && offset >= arr.length) {
        _arrArr.push(arr.slice(0, offset));
    }
    while (arr.length >= _pointer + x) {
        _arrArr.push(arr.slice(_pointer, _pointer + x));
        _pointer += x;
    }
    if (arr.length) {
        _arrArr.push(arr.slice(_pointer, arr.length - 1));
    }
    return _arrArr;
};

我编写了第二个函数,因为我想从原始数组中复制所需的部分要比复制原始数组并每次拼接开头都要快(这两个函数应该做同样的事情,第一个使用splice,第二个切片)-I tested it and this doesnt seem to be the case,它们都花相同的时间。

我的理论是,在这两种情况下,编译器都知道我要做什么,并创建相同的代码。 我也可能完全错了,如果没有优化,第二个版本应该不会更快。

你知道这是怎么回事吗?

1 个答案:

答案 0 :(得分:1)

  

I tested it and this doesnt seem to be the case,它们都花费相同的时间。

否,您的测试用例已损坏。 JSperf不会为您的每个代码片段运行都运行设置和拆卸,而是在设置和拆卸之间循环运行 您的代码片段。您将在第一次运行时清空testArr,其余的迭代仅测量while (testArr.length > 1)条件评估(产生false)。

I've updated the benchmark,并且正如预期的那样slice现在表现更好。