title: perf_notes date: 2018-08-26 20:35:17 tags: ECMAScript
来源 Angular Core Reader3 中的 perf-notes
通用
每个 Array 开销为 70 字节,由数组和 (array) 对象组成。
- 显式定义的数组 item 每个 32 字节。
- (array) 虚拟机对象是 38 字节。
每个对象开销为 24 字节 加 每个属性 8 字节。
直接储存数据作为列表来使用是比小数组的更有性能效率。 速度比较结果
Monomorphic vs Megamorphic code
Great reads:
- Monomorphic prop access is 100 times faster than megamorphic.
- Monomorphic call is 4 times faster the megamorphic call.
See benchmark here.
总结 静态定义比灵活定义的性能好,有几倍的差距。
Exporting top level variables
在可能的情况下,应尽可能避免导出顶级变量 和代码大小很重要:
// Typescript
export let exported = 0;
let notExported = 0;
notExported = exported;
// Would be compiled to
exports.exported = 0;
var notExported = 0;
notExported = exports.exported;
大多数压缩工具都不会重命名属性(除了闭包内的) 所以可以这样写:
let exported = 0;
export function getExported() { return exported; }
export function setExported(v) { exported = v; }
Also writing to a property of exports
might change its hidden class resulting in megamorphic access.
另外, exports
的属性写入(不易察觉)导致了 megamorphic 的访问,速度下降。
Iterating over Keys of an Object.
https://jsperf.com/object-keys-vs-for-in-with-closure/3 明确指出 Object.keys
是最快遍历对象的方式。
for (var i = 0, keys = Object.keys(obj); i < keys.length; i++) {
const key = keys[i];
}
Recursive functions
尽可能避免使用递归函数,因为它们无法内联。
总结 递归性能会下降。
Loops
Don't use foreach, it can cause megamorphic function calls (depending on the browser) and function allocations. 不要使用foreach,它可能会调用 megamorphic 函数(取决于浏览器)和 函数分配。
总结 foreach 比 for 慢。