本文来源于知乎上的一个提问。
为了程序的易读性,我们会使用 ES6 的解构赋值:
这个例子的函数调用中,会真的产生一个对象吗?如果会,那大量的函数调用会白白生成很多有待 GC 释放的临时对象,那么就意味着在函数参数少时,还是需要尽量避免采用解构传参,而使用传统的:
上面的描述其实同时提了好几个问题:
会不会产生一个对象?
参数少时,是否需要尽量避免采用解构传参?
对性能(CPU/内存)的影响多大?
1. 从 V8 字节码分析两者的性能表现
首先从上面给的代码例子中,确实会产生一个对象。但是在实际项目中,有很大的概率是不需要产生这个临时对象的。
我之前写过一篇文章使用 D8 分析 javascript 如何被 V8 引擎优化的。那么我们就分析一下你的示例代码。
鉴于很多人没有 d8,因此我们使用 node.js 代替。运行:
其中的 可以查看 V8 引擎生成的字节码。在输出结果中查找 :
将当前在累加器中的值存储在寄存器 中。
将小整数(Smi) 加载到累加器寄存器中。
而函数体只有两行代码: 和 Add a0 。
当我们使用解构赋值后:
我们可以看到,代码明显增加了很多, 创建了一个对象。本来只有 2 条核心指令的函数突然增加到了近 20 条。其中不乏有 、 、 这种指令。
领取专属 10元无门槛券
私享最新 技术干货