您一直在调查一些高度依赖于您运行的浏览器的特定版本的内容.以下是我在运行jsperf测试时得到的一些结果:
在Chrome 47中,new Empty
运行速度为63m ops/sec,而Object.create(null)
运行速度为10m ops/sec.
在Firefox 39中,new Empty
运行速度为733m ops/sec,而Object.create(null)
运行速度为1,685m ops/sec.
(上面的"m"表示我们谈论的是数百万.)
那你选哪一个?在一个浏览器中最快的方法在另一个浏览器中最慢.
不仅如此,我们在这里看到的结果很可能随着新的浏览器版本而改变.例如,我已经检查了Object.create
v8中的实现.截至2015年12月30日,实现Object.create
是用JavaScript编写的,但最近提交将其更改为C++实现.一旦这使得它的方式进入浏览器,比较的结果Object.create(null)
,并new Empty
要改变.
但这并不是全部...
你看只是一个方面使用的Object.create(null)
创建将被用作样图(伪地图)的对象.那个伪地图的访问时间怎么样?这是一个检查未命中性能的测试,以及一个检查命中性能的测试.
在Chrome 47上,使用创建对象时,命中和未命中情况的速度提高了90%Object.create(null)
.
在Firefox 39上,命中案例都执行相同的操作.对于未命中的情况,创建的对象的性能Object.create(null)
是如此之大,以至于jsperf告诉我操作数/秒是"无限".
使用Firefox 39获得的结果是我实际期待的结果.JavaScript引擎应该在对象本身中寻找字段.如果它是一个命中,那么无论对象是如何创建的,搜索都会结束.如果在对象本身中找不到字段,则JavaScript引擎必须检入对象的原型.在使用创建的对象的情况下,Object.create(null)
没有原型,因此搜索在那里结束.对于使用创建的对象new Empty
,有一个原型,JavaScript引擎必须在其中进行搜索.
现在,在伪地图的生命周期中,伪地图的创建频率是多少?它被访问的频率是多少?除非你处于一个非常特殊的情况,否则地图应该创建一次,但是可以多次访问. 因此,命中和未命中的相对性能对应用程序的整体性能更重要,然后是创建对象的各种方法的相对性能.
我们还可以查看从这些伪映射中添加和删除键的性能,我们将了解更多信息.然后,也许你有地图,你从来没有删除密钥(我有一些),所以删除性能可能对你的情况不重要.
最终,您应该为提高应用程序性能而进行分析的是您作为系统的应用程序.通过这种方式,实际应用程序中各种操作的相对重要性将反映在您的结果中.
您一直在调查一些高度依赖于您运行的浏览器的特定版本的内容.以下是我在运行jsperf测试时得到的一些结果:
在Chrome 47中,new Empty
运行速度为63m ops/sec,而Object.create(null)
运行速度为10m ops/sec.
在Firefox 39中,new Empty
运行速度为733m ops/sec,而Object.create(null)
运行速度为1,685m ops/sec.
(上面的"m"表示我们谈论的是数百万.)
那你选哪一个?在一个浏览器中最快的方法在另一个浏览器中最慢.
不仅如此,我们在这里看到的结果很可能随着新的浏览器版本而改变.例如,我已经检查了Object.create
v8中的实现.截至2015年12月30日,实现Object.create
是用JavaScript编写的,但最近提交将其更改为C++实现.一旦这使得它的方式进入浏览器,比较的结果Object.create(null)
,并new Empty
要改变.
但这并不是全部...
你看只是一个方面使用的Object.create(null)
创建将被用作样图(伪地图)的对象.那个伪地图的访问时间怎么样?这是一个检查未命中性能的测试,以及一个检查命中性能的测试.
在Chrome 47上,使用创建对象时,命中和未命中情况的速度提高了90%Object.create(null)
.
在Firefox 39上,命中案例都执行相同的操作.对于未命中的情况,创建的对象的性能Object.create(null)
是如此之大,以至于jsperf告诉我操作数/秒是"无限".
使用Firefox 39获得的结果是我实际期待的结果.JavaScript引擎应该在对象本身中寻找字段.如果它是一个命中,那么无论对象是如何创建的,搜索都会结束.如果在对象本身中找不到字段,则JavaScript引擎必须检入对象的原型.在使用创建的对象的情况下,Object.create(null)
没有原型,因此搜索在那里结束.对于使用创建的对象new Empty
,有一个原型,JavaScript引擎必须在其中进行搜索.
现在,在伪地图的生命周期中,伪地图的创建频率是多少?它被访问的频率是多少?除非你处于一个非常特殊的情况,否则地图应该创建一次,但是可以多次访问. 因此,命中和未命中的相对性能对应用程序的整体性能更重要,然后是创建对象的各种方法的相对性能.
我们还可以查看从这些伪映射中添加和删除键的性能,我们将了解更多信息.然后,也许你有地图,你从来没有删除密钥(我有一些),所以删除性能可能对你的情况不重要.
最终,您应该为提高应用程序性能而进行分析的是您作为系统的应用程序.通过这种方式,实际应用程序中各种操作的相对重要性将反映在您的结果中.