为什么是冻结的“枚举”?慢

Why is a frozen "enum" slower?

本文关键字:枚举 冻结 为什么      更新时间:2023-09-26

为了访问数组中的数据,我创建了一个类似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报告,冻结对象当前将使其处于"字典模式",这是缓慢的。

因此,对于"枚举"/小数组,它非但没有提高性能,反而会减慢速度。