Angular Core Reader3 中的 perf-notes

2020-11-19


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:

  1. Monomorphic prop access is 100 times faster than megamorphic.
  2. 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 慢。

It is a lot slower than regular for loops

copyright ©2019-2024 shenzhen
粤ICP备20041170号-1