gpt4 book ai didi

javascript - Javascript 对象实例化大小和方法的性能差异很大

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:29:35 24 4
gpt4 key购买 nike

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

谁能阐明以下 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 上,我在所有四种情况下都获得了几乎相同的性能:

FF45 benchmark run

大概 JIT 编译器足够聪明,可以在这里执行死代码消除,所以我们实际上是在对一个空循环进行基准测试。换句话说,这个结果显示了编译器的优化程度,而不是对象分配的成本。

Making the objects escape进入全局范围会产生以下结果,这是人们所期望的:

enter image description here

请注意,足够先进的编译器™ 可能会从循环中消除除最后一次分配之外的所有分配,方法是观察它们都写入同一个变量而不在迭代之间读取。

所以 future 的浏览器版本可能会再次“打破”这个基准。

微基准测试是一项棘手的工作。

关于javascript - Javascript 对象实例化大小和方法的性能差异很大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34231755/

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