Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按字符串或整数访问数值属性更快?_Javascript_Performance - Fatal编程技术网

Javascript 按字符串或整数访问数值属性更快?

Javascript 按字符串或整数访问数值属性更快?,javascript,performance,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[

在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

虽然字符串和数字对于获取和设置都是可互操作的,但速度更快(对于数组和对象而言)?

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


我注意到上面的JSPERF中有几个潜在的问题:

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

  • 对象和数组都用单调递增的值填充和访问。JIT可能会识别出这一点,并将对象转换为非稀疏数组

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

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

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


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

键实际上可以是任何东西,而不仅仅是整数或字符串。@MikeChristensen不完全正确,其他对象被转换为字符串。为了演示它:
varo={},a=[];o[a]=2;警报(o[“”])
整数也会转换为字符串。也就是说
a[1]
a[“1”]
占用同一个插槽。对于对象
o[{}]
o[“[对象对象]”]
也占用相同的空间这是一个微观优化问题,真的获得了这么多的选票吗?@JuanMendes如果可能的话,你也可以说字符串被转换成整数<代码>变量a=[];a[“42”]=1;a、 长度==43问得好,回答得好。我敢打赌,这很快就会融入我的JS内容中。对我来说,这是令人惊讶的,因为数组扩展了对象,对象通过字符串访问键。所以我假设整数必须转换成字符串才能进行散列。但是可能对整数进行了一些优化(也许整数就是散列)@Jay:Chrome平均来说是最好的——条越长,浏览器的性能越好。:)@埃利奥特·博纳维尔:那是有道理的,我认为x轴就是时间。