JavaScript对象属性访问性能差异:字母键为何快于数字键?
问题背景说明
我好奇哪种存储引用列表的方式在后续访问特定项时速度更快。
为测试性能,我创建了两个变量,它们包含相同的条目列表,每个条目都有一个键和对原始元素的引用。
我创建了一个对象,其中属性为键,值为引用;同时创建了一个数组,数组中的每个对象都包含key属性和存储引用的ref属性。
我想测试哪种方式访问特定项的速度更快。
const elementIDsObj = { "123": "123", "234": "123", "345": "123", "456": "123", "567": "123", "678": "123", "789": "123", "890": "123", "901": "123", "012": "123", "abc": "123" }; const elementIDsArray = [ {key: "123", ref: "123"}, {key: "234", ref: "123"}, {key: "345", ref: "123"}, {key: "456", ref: "123"}, {key: "567", ref: "123"}, {key: "678", ref: "123"}, {key: "789", ref: "123"}, {key: "890", ref: "123"}, {key: "901", ref: "123"}, {key: "012", ref: "123"}, {key: "abc", ref: "123"} ];
访问对象类型的特定项时,我只需使用elementsIDsObj[KEY];访问数组类型的特定项时,我使用elementIDsArray.find(item => item.key === KEY);
我做这个对比是因为不清楚对象属性直接访问的实现方式,以为它和我用数组结构实现的方式类似。
结果表明,实际实现和我想的不同,因此对象属性直接访问比数组的迭代查找快得多。
问题
最初我只使用纯数字字符串作为键,最后添加了一个纯字母键。我惊讶地发现,使用含至少一个字母的键进行直接访问,速度远快于纯数字键。
我想了解这是为什么,对象属性访问背后的机制是什么,导致了如此巨大的访问时间差异。
测试环境
Google Chrome 103.0.5060.134(MacOS Monterey 12.3.1)
| 字母键 | 纯数字键 | |
|---|---|---|
| Ops/s | 575,490,052.66 ± 4.68% | 47,066,784.33 ± 2.74% |
Mozilla Firefox 80.0.1(64位,MacOS Monterey 12.3.1)
| 字母键 | 纯数字键 | |
|---|---|---|
| Ops/s | 1,139,482,575.49 ± 7.52% | 214,063,334.44 ± 3.2% |
Mozilla Firefox 103.0.1(64位,MacOS Monterey 12.3.1)
| 字母键 | 纯数字键 | |
|---|---|---|
| Ops/s | 1,279,722,302.67 ± 0.91% | 1,210,963,390.96 ± 3.27% |
Google Chrome 104.0.5112.69(Android 11 - One Plus)
| 字母键 | 纯数字键 | |
|---|---|---|
| Ops/s | 148,180,565.26 ± 0.6% | 7,392,240.71 ± 0.41% |
Mozilla Firefox 103.1.0(Android 11 - One Plus)
| 字母键 | 纯数字键 | |
|---|---|---|
| Ops/s | 677,170,098.93 ± 0.42% | 681,474,092.7 ± 0.22% |
看起来Firefox的JS引擎经过修改后消除了这种巨大差异,而Chrome的实现仍存在显著性能差距。
提前感谢解答
内容的提问来源于stack exchange,提问作者IISkullsII
相关产品推荐
相关产品推荐

