我想知道对象成员的访问时间。更确切地说,我正在对window
对象的访问时间进行基准测试。我相信我可以自己解释大部分行为,但听到一些评论我会感觉更好。
用例:不同属性的访问时间不同?
我在Firefox 3.6.8(windows)上进行基准测试,简单的测量代码如下所示:
var loop = 100000;
console.time('bench');
while(loop--){
if(window.JSON)
var foo = 0;
}
console.timeEnd('bench');
第一个奇怪的是,它使我正在查找的属性与众不同。例如,window.JSON
似乎比window.localStorage
访问速度更快。还有其他属性/方法可以更快地访问
由于ECMA-262 Language Specification中没有规范或定义,对象中的顺序键必须具有,我猜每个浏览器供应商都会实现它自己的逻辑,其中keys
顺序存储在内存中。 />
这可能是对这种行为的解释吗?比如,JSON
是最早的密钥之一,location
最后是更多的密钥? (至少在我的测试环境中)
-
我注意到的另一件事是,调用if(JSON)
略快于if(window.JSON)
。如果我们忘记了你因为可能的引用错误而总是应该进行第二次调用,那些调用应该具有相同的访问时间。我知道nested member lookups
上的ECMA脚本行为(嵌套成员将导致Javascript引擎通过对象成员解析,每次遇到点),所以{{1} }必须慢于window.location.href
,但在这种情况下...... location.href
和JSON
之间有区别吗?
要结束此操作,了解window.JSON
对象是否拥有特定属性/方法的最快方法是使用window
运算符。对于上述示例,这大约快10倍。
答案 0 :(得分:3)
您注意到的第一个奇怪的事情可能与浏览器如何实现host objects有关。
localStorage
是主机对象,由环境提供,另一方面,JSON
是由ECMAScript提供的built-in object。
尝试解析其他内置内容,与JSON
相比,您获得的结果大致相同。
现在,关于JSON
与window.JSON
的区别:
window
只是全局对象上指向自身的属性,当您访问window
标识符时,会发生名称解析过程以找到它。
基本上引用:
JSON;
仅涉及一个标识符查找(在范围链中),并且:
window.JSON;
涉及标识符查找(window
)和属性查找(window.JSON
)。