使用Javascript对象实例化大小和方法的大性能差异

我注意到各种对象实例化方法之间存在显着的性能差异.此外,似乎对象的大小(即属性的#)有时很重要.

任何人都可以对以下jsperf的结果有所了解吗?
http://jsperf.com/objects-w-more-less-8-properties/5

var thisobj = {a:1,b:2,c:3,d:4,e:5,f:6,g:7,h:8} 

这似乎是放弃创建新对象的禁食方式

var thisobj = {a:1,b:2,c:3,d:4,e:5,f:6,g:7,h:8,i:9}

这是非常慢的……唯一的区别是第9个值

var thisobj = new objsm(1,2,3,4,5,6,7,8); 

var thisobj = new objlg(1,2,3,4,5,6,7,8,9);

两者之间的差别不大(大概和预期的差不多),但它们仍然与上面的“动态”定义的对象有很大的不同.他们的对象在这里定义:

    var objsm = function (a,b,c,d,e,f,g,h) {
    this.a = a; this.b = b; this.c = c; this.d = d; this.e = e; this.f = f; this.g = g; this.h = h;}

var objlg = function (a,b,c,d,e,f,g,h,i) {
this.a = a; this.b = b; this.c = c; this.d = d; this.e = e; this.f = f; this.g = g; this.h = h; this.i = i; }

为什么“var thisobj = {a:1,b:2,c:3,d:4,e:5,f:6,g:7,h:8}”这么优秀?

最佳答案 像这样的性能差异通常不是由于语言javascript,而是由于该语言的实现.

其他因素,例如堆占用(以及由此产生的GC成本)也会影响性能.

由于存在多个实现 – 这些实现在不断发展 – 并且浏览器没有吐出生成的程序集的习惯,因此没有一般性的答案.

例如在FF 45上,我在所有四种情况下获得了几乎相同的性能:

《使用Javascript对象实例化大小和方法的大性能差异》

据推测,JIT编译器非常智能,可以在这里执行死代码消除,因此我们基本上是对空循环进行基准测试.换句话说,这个结果显示了编译器的优化程度,而不是对象分配的成本.

Making the objects escape进入全球范围会产生以下结果,这些结果与人们的预期相符:

《使用Javascript对象实例化大小和方法的大性能差异》

请注意,一个足够先进的编译器™可能通过观察它们都写入相同的变量而没有迭代之间的读取来消除循环中的最后一个分配.

所以未来的浏览器版本可能会再次打破这个基准.

微型计算机是一项棘手的业务.

点赞