时间第一个呼叫功能在节点中



我有以下代码:

let startTime;
let stopTime;
const arr = [1, 2, 3, 8, 5, 0, 110, 4, 4, 16, 3, 8, 7, 56, 1, 2, 3, 8, 5, 0, 110, 16, 3, 8, 7, 56];
const sum = 63;
durationTime = (start, stop, desc) => {
    let duration = (stop - start);
    console.info('Duration' + ((desc !== undefined) ? '(' + desc + ')' : '') + ': ' + duration + 'ms');
};
findPair = (arr, sum) => {
    let result = [];
    const filterArr = arr.filter((number) => {
        return number <= sum;
    });
    filterArr.forEach((valueFirst, index) => {
        for (let i = index + 1; i < filterArr.length; i++) {
            const valueSecond = filterArr[i];
            const checkSum = valueFirst + valueSecond;
            if (sum === checkSum) {
                result.push([valueFirst, valueSecond]);
            }
        }
    });
    //console.info(result);
};
for (let i = 0; i < 5; i++) {
    startTime = new Date();
    findPair(arr, sum);
    stopTime = new Date();
    durationTime(startTime, stopTime);
}

当我在Nodejs(v8.9.3)上本地运行时,控制台的结果:

持续时间(0):4ms

持续时间(1):0ms

持续时间(2):0ms

持续时间(3):0ms

持续时间(4):0ms

我的问题:为什么" findpair"的第一个呼叫只需4ms和其他电话0ms?

第一次运行循环时JavaScript引擎(Google的V8)解释代码,编译并执行。但是,运行越来越多的代码将对它进行了编译的代码优化和缓存,以便该代码的后续运行可以更快地运行。 loops 内部的代码将是经常运行的代码的一个很好的例子。

除非您摆弄原型和可能使该缓存代码无效的事物,否则它将继续运行该缓存的代码,该代码比每次运行时都要解释代码要快得多。

V8有很多智能的事情可以使您的代码运行更快,如果您对这些东西感兴趣,我强烈建议您阅读我的答案来源:

动态内存和javaScript的V8

JavaScript的工作方式:在V8 Engine内部 5个有关如何编写优化代码

的提示

在开始之前,更好的时间测量为:

for (let i = 0; i < 5; i++) {
    console.time('timer '+i);
    findPair(arr, sum);
    console.timeEnd('timer ' + i);
}

...

第一个函数调用速度较慢,可能是因为V8在幕后动态创建隐藏的类,并且(最初)将函数放入其中。

有关https://github.com/v8/v8/wiki/design lements#fast-property-access

的更多信息

最新更新