Chrome性能:"标准"属性名称与非标准名称

dan*_*ndi 12 javascript performance google-chrome

所以这是一个有趣的...当我在一个元素上测试setAttribute与普通属性设置的性能时,我发现了一个奇怪的行为,然后我在常规对象上进行了测试......它仍然很奇怪!

因此,如果您有一个对象A = {},并且您将其属性设置为A['abc_def'] = 1,或者A.abc_def = 1它们基本相同.但是如果你做A['abc-def']= 1或A['123-def']= 1那么你就麻烦了.它变得越来越慢.我在这里设置了一个测试:http://jsfiddle.net/naPYL/1/.它们在除chrome之外的所有浏览器上都是相同的.有趣的是,对于"abc_def"属性,chrome实际上比Firefox和IE快得多,正如我所料.但对于"abc-def"来说,它的速度至少要慢两倍.

所以这里基本上(至少从我的测试中)发生的是,当使用属性的"正确"语法时(法律C语法,你可以使用点属性) - 它很快,但是当你使用需要使用括号的语法时(a [...]那你就麻烦了.

我试图想象在两种模式之间以这种方式区分哪种实现细节,而不是.因为我想到它,如果你支持那些非标准名称,你可能正在将所有名称翻译成相同的机制,其余的只是编译成该机制的语法.所以.编译后,语法和[]应该都是一样的.但显然有一些事情在这里反过来......

如果不看V8的源代码,有人会想到一个非常令人满意的答案吗?(把它想象成一个练习:-))

这里也是一个快速的jsperf.com示例

感谢JDMperf的NDM示例!

编辑:

为了澄清,我当然也希望从实际代码(我已经找到)中得到具体答案,或者更确切地说 - 具体实现背后的原因.这就是我要求你把它看作"练习"的原因之一,看看技术实现的背后并试图找到原因.

但我也希望看到其他人的思想如何在这些案例中发挥作用.对于你们中的一些人来说,这听起来可能"模糊" - 但是不时地尝试和其他人一样思考,或者采取他们的观点是非常有用的.它增强了你自己的思维方式.

Esa*_*ija 5

所以JS对象可以用于两个相互冲突的目的.它们可以用作对象,但它们也可以用作哈希表.然而,对于哈希表来说,快速且有意义的对象并非如此,因此V8会尝试猜测给定对象是什么.

用户可以给出一些迹象表明他希望字典删除属性或为属性提供无法使用点表示法访问的名称.

还使用了其他一些启发式方法,我已经提出了一个要点https://gist.github.com/petkaantonov/6327915.

然而,有一个非常酷的黑客从哈希表地狱中兑换一个对象:

function ensureFastProperties(obj) {
    function f() {}
    f.prototype = obj;
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

请参阅以下内容:http://jsperf.com/property-dash-parformance/2.

兑换的对象不如原始对象快,因为属性存储在外部属性数组中而不是对象中.但这仍然比哈希表好得多.请注意,这仍然是相当破碎的基准测试,不要认为哈希表只比inobject属性慢2倍.