为什么是冻结的“枚举”?慢
Why is a frozen "enum" slower?
为了访问数组中的数据,我创建了一个类似enum
的变量,为字段提供人类可读的标识符。
var columns = { first: 0, second: 1 };
var array = ['first', 'second'];
var data = array[columns.first];
当我发现关于Object.freeze
时,我想将此用于枚举,以便它不能被更改,并且我期望VM使用此信息来发挥其优势。
结果是,测试在Chrome和Node上变慢了,但在Firefox上稍微快了一点(与直接按数字访问相比)。
代码可在这里获得:http://jsperf.com/array-access-via-enum
下面是来自Node的基准测试(对应于JSPerf测试):
fixed Number: 12ms
enum: 12ms
frozenEnum: 85ms
是V8还没有一个伟大的实现,还是有一些次优的方法,对于我的用例?
我在Firefox 20上测试了你的测试,它全面快得多,而IE 10稍微快一点,更一致。
所以我的答案是不,V8还没有一个伟大的实现
根据此bug报告,冻结对象当前将使其处于"字典模式",这是缓慢的。
因此,对于"枚举"/小数组,它非但没有提高性能,反而会减慢速度。
相关文章:
- 如何发送分配列表<字符串>到JavaScript数组或可枚举对象
- 枚举附加到文档的HTML对象的所有事件
- JavaScript数组的子类化破坏了快速枚举
- 为什么Javascript程序员更喜欢在代码中重复字符串作为常量,而不是使用枚举类型的对象
- 不可枚举的属性出现在 for..在 Chrome 中循环
- json模式v4如何根据枚举实现枚举
- 如何访问从 jstl foreach 到 jQuery 的枚举值
- 如何从 Javascript 访问 Java 枚举 (Java 1.8)
- JSON.stringify未序列化可枚举属性
- 为什么ES6 WeakMap's不可枚举
- 如何在另一个对象中枚举一个对象
- Javascript propertyIsNumerable-是否有可枚举的方法
- Javascript不可枚举属性
- TypeScript 中的枚举:JavaScript 代码在做什么
- 使用枚举作为类型/接口
- sails.js:枚举的模型定义 - 动态值列表
- 如何更改 Javascript 对象属性的可写可枚举和可配置值
- 如何将中继变量设置为枚举值
- JavaScript for.in 和枚举奇怪的行为
- 为什么是冻结的“枚举”?慢