当前位置:  开发笔记 > 编程语言 > 正文

为什么Object.create比构造函数慢得多?

如何解决《为什么Object.create比构造函数慢得多?》经验,为你挑选了1个好方法。

您一直在调查一些高度依赖于您运行的浏览器的特定版本的内容.以下是我在运行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.createv8中的实现.截至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引擎必须在其中进行搜索.

现在,在伪地图的生命周期中,伪地图的创建频率是多少?它被访问的频率是多少?除非你处于一个非常特殊的情况,否则地图应该创建一次,但是可以多次访问. 因此,命中和未命中的相对性能对应用程序的整体性能更重要,然后是创建对象的各种方法的相对性能.

我们还可以查看从这些伪映射中添加和删除键的性能,我们将了解更多信息.然后,也许你有地图,你从来没有删除密钥(我有一些),所以删除性能可能对你的情况不重要.

最终,您应该为提高应用程序性能而进行分析的是您作为系统的应用程序.通过这种方式,实际应用程序中各种操作的相对重要性将反映在您的结果中.



1> Louis..:

您一直在调查一些高度依赖于您运行的浏览器的特定版本的内容.以下是我在运行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.createv8中的实现.截至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引擎必须在其中进行搜索.

现在,在伪地图的生命周期中,伪地图的创建频率是多少?它被访问的频率是多少?除非你处于一个非常特殊的情况,否则地图应该创建一次,但是可以多次访问. 因此,命中和未命中的相对性能对应用程序的整体性能更重要,然后是创建对象的各种方法的相对性能.

我们还可以查看从这些伪映射中添加和删除键的性能,我们将了解更多信息.然后,也许你有地图,你从来没有删除密钥(我有一些),所以删除性能可能对你的情况不重要.

最终,您应该为提高应用程序性能而进行分析的是您作为系统的应用程序.通过这种方式,实际应用程序中各种操作的相对重要性将反映在您的结果中.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有