我正在测试一个朋友注意到的测试用例。他在循环中使用window.innerheight,帧速率出现了非常显著的下降。
这是我为测试它而创建的jsperf的链接http://jsperf.com/innerheight
我能想到的唯一解释是,这是一个getter,并在每次调用时计算实际高度。是这样吗?有任何我可以验证的文件吗?
这个问题是几年前发布的,但只是为了防止其他人在这里遇到类似的结果。
来自这个博客:
问题是WebKit几乎每次使用类似于getBoundingClientRect的东西时都喜欢重新计算dom的布局。(即使获取window.innerHeight/innerWidth也会强制重新计算)。。。应该缓存或避免从DOM中获取任何计算维度的所有调用。
在初始化和每次调整大小时缓存一次窗口尺寸,显著提高了我的性能。
在第一个循环(innerheight)中,您正在访问对象属性并将其分配给h
。在第二个循环(缓存)中,您只有h
。当然,缓存的会更快。