通过字符串或整数更快地访问数字属性?

时间:2012-05-17 16:16:38

标签: javascript performance

在JavaScript中,您可以使用整数或字符串来获取和设置数组的索引和对象的“数字”属性,并获得相同的结果:

var a=[], o={};
a[1]    = "foo";  a["1"]   == "foo" // true
a["2"]  = "bar";  a[2]     == "bar" // true
a["-3"] = "baz";  a[-.3e1] == "baz" // true
o[1]    = "foo";  o["1"]   == "foo" // true
o["2"]  = "bar";  o[2]     == "bar" // true
o["-3"] = "baz";  o[-.3e1] == "baz" // true

虽然字符串和数字是可互操作的 - 但是获取和设置 - 这对于数组和对象来说都更快?

2 个答案:

答案 0 :(得分:21)

不出所料,数组访问的整数比字符串快。也许令人惊讶的是,它们比对象属性的字符串更快。

http://jsperf.com/string-vs-integer-array-indices

enter image description here

http://jsperf.com/string-vs-integer-object-indices

enter image description here

答案 1 :(得分:0)

我在上面的JSPERF中注意到了两个潜在的问题:

  • 在GET测试中,根本没有使用x的值,因此JIT优化器可能会完全丢弃该表达式

  • 对象和数组都被填充并使用单调递增的值进行访问。 JIT可能会认识到这一点,然后将对象转换为非稀疏数组。

  • 总是使用字符串键初始化查找对象,使用整数键初始化它时,我们也需要进行测试(因为运行时可能具有特殊的路径)。

结果可见here。 请注意,我在早期版本中首先犯了一个错误,我忘记了将随机索引转换为整数,这使得字符串键查找比浮点键查找快得多……

我可能犯了更多的错误,欢迎发表评论:)

PS:在Safari / OSX上进行的几次运行中,非常奇怪的是,从用整数键初始化的对象中读取整数键的性能非常差,但是当用字符串键填充对象并读取它时用整数键返回非常快。这对我来说没有意义?也许我们需要在这里进行更多的测试