Javascript 类上函数包装器的性能基准测试与仅构造函数调用和HaveSameMap
我对代码A和代码B做了一些性能测量,我想知道为什么V8输出会这样 代码AJavascript 类上函数包装器的性能基准测试与仅构造函数调用和HaveSameMap,javascript,performance,performance-testing,v8,Javascript,Performance,Performance Testing,V8,我对代码A和代码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(%HaveSame
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
第一个问题,究竟为什么havesamap返回false。我相信a和b都有相同的形状和经历相同的过程。那么为什么它们会不同呢
代码B
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
}
var a = new Point();
var b = new Point();
第二个问题-比较这两个系统的性能时间有很大的不同。我只想了解V8的基本类型系统。为什么会这样。调用newpoint()
vs在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必须创建大量内部数据结构以支持快速创建实例。一次使用一个类就可以克服这种非常常见的模式,即你所看到的减速。你在每次调用makePoint
时都会创建一个新的点
类。当您直接返回类时,这可能会变得更加明显:
const makePoint = (x, y) => {
class Point {...};
return Point;
}
每次计算类文本时都会创建一个类。在类定义之前添加console.log
时,您可能会看到这种情况。在您的情况下,每次都会对其进行评估
类似地,每次创建一个新类的成本比简单地重复使用同一个类要高。V8必须创建大量内部数据结构以支持快速创建实例。一次使用一个类就可以克服这种非常常见的模式,即您所看到的减速。在您的第一个代码片段中,您不仅在makePoint
中创建了实例,而且还创建了类点本身。每次调用makePoint()
,您都创建了一个新类:
console.log(makePoint().constructor === makePoint().constructor) // false
我想你在找我
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
}
const makePoint = () => new Point(1, 2);
const a = makePoint();
const b = makePoint();
console.log(%HaveSameMap(a, b)); // true
console.log(a.constructor == b.constructor, a.constructor == Point); // true, true
在第一个代码片段中,您不仅在makePoint
中创建了实例,还创建了类点本身。每次调用makePoint()
,您都创建了一个新类:
console.log(makePoint().constructor === makePoint().constructor) // false
我想你在找我
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
}
const makePoint = () => new Point(1, 2);
const a = makePoint();
const b = makePoint();
console.log(%HaveSameMap(a, b)); // true
console.log(a.constructor == b.constructor, a.constructor == Point); // true, true
你是如何测试性能的?你是不是为了得到一个平均值而反复测试了几百次或几千次?您是否先运行一个,然后运行另一个,但在同一个代码文件中—JIT可以修改您的值。请概述您的性能测试方法。我认为这两个问题应该在0 2堆栈溢出问题中分开,而不是混为一谈。是的。我只是运行了很多次while循环。我会更新同样的问题,作为优秀的程序员,我们应该代码冗余。因此,一个代码和两个问题。哈哈。不管怎样,这是相互关联的。我建议你打破了单一责任规则:)你是如何测试性能的?你是不是为了得到一个平均值而反复测试了几百次或几千次?您是否先运行一个,然后运行另一个,但在同一个代码文件中—JIT可以修改您的值。请概述您的性能测试方法。我认为这两个问题应该在0 2堆栈溢出问题中分开,而不是混为一谈。是的。我只是运行了很多次while循环。我会更新同样的问题,作为优秀的程序员,我们应该代码冗余。因此,一个代码和两个问题。哈哈。不管怎样,它是相互关联的。我建议你打破了单一责任规则:)这就是我要找的。你也可以看看我的这个问题吗?这就是我要找的。你也可以看看我的这个问题吗?这是一个很好的解释,但对形状/哈希图还是更困惑。你肯定更清楚我的第二点+1'ed.这是一个很好的解释,但对形状/哈希映射的理解还是比较混乱的。你肯定更清楚我的第二点+1'ed。