gpt4 book ai didi

javascript - 函数包装器在类上的性能基准测试与仅构造函数调用调用和 HaveSameMap 的对比

转载 作者:行者123 更新时间:2023-11-30 09:21:05 25 4
gpt4 key购买 nike

我用 CODE A 和 CODE B 做了一些性能测量,想知道为什么 V8 会这样输出。

代码A

const makePoint = () => {
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
}

return new Point(1, 2);
}

const a = makePoint();
const b = makePoint();

console.log(%HaveSameMap(a, b)); // false

第一个问题,为什么 HaveSameMap 返回 false。我相信 a 和 b 都具有相同的形状并经历相同的过程。那么为什么他们会不同呢?

代码B

class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
}
var a = new Point();
var b = new Point();

第二个问题 - 比较两者的性能时间有很大差异。我只想了解 V8 类型系统的底层。为什么会这样。调用 new Point() 与在 makePoint() 函数中返回它。这是怎么回事?

更新 - 测试方法

我正在通过外部包进行测试

我的测试代码看起来像

const { performance } = require('perf_hooks');

performance.mark('start');

while (iterations--) {
makePoint();
}

performance.mark('end');

performance.measure('My Special Benchmark', 'start', 'end');

最佳答案

您在每次调用 makePoint 时都会创建一个新的 Point 类。当您直接返回类时,这可能会变得更加明显:

const makePoint = (x, y) => {
class Point {...};
return Point;
}

每次评估类文字时都会创建一个类。在类定义之前添加 console.log 时,您可以稍微看到这种情况的发生。在您的情况下,每次都会进行评估。

同样,每次创建一个新类比简单地重复使用同一个类的成本更高。 V8 必须创建大量内部数据结构来支持快速创建实例。单次使用一个类会破坏这种非常常见的模式,即您看到的减速。

关于javascript - 函数包装器在类上的性能基准测试与仅构造函数调用调用和 HaveSameMap 的对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51610434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com