RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库

上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。

首先,为了弄清楚Most库究竟为何如此快,我必须借助其他工具。比如chrome 的devtools性能分析,刚开始我运行node --inspect来启动性能测试代码,然后打开chrome浏览器,在chrome://inspect里面打开nodejs调试工具,不过每次这样操作比较繁琐,后来直接用Nodejs提供的inspector模块来生成cpuprofile文件。

1const inspector = require('inspector'); 2const fs = require('fs'); 3const session = new inspector.Session(); 4session.connect(); 5 6 7function logStart() { 8 console.log(this.name); 9 console.log('-----------------------------------------------'); 10 session.post('Profiler.enable', () => { 11 session.post('Profiler.start', () => { 12 // invoke business logic under measurement here... 13 14 }); 15 }); 16} 17 18function logComplete() { 19 console.log('-----------------------------------------------'); 20 // some time later... 21 session.post('Profiler.stop', (err, { 22 profile 23 }) => { 24 // write profile to disk, upload, etc. 25 if (!err) { 26 fs.writeFileSync('./profile.cpuprofile', JSON.stringify(profile)); 27 } 28 }); 29}

cpuprofile

我们可以看到每一种库占用的CPU的情况,下面我们先来看一下Most库的情况:

Most库

Most库里面有一个时间轴,然后把任务分配到时间轴上运行,所以我们会看到很多task的关键词,当然现在的性能测试并没有发挥时间轴的作用,我们看到这一次性能采集运行了57.3ms,下面的操作符函数占用cpu的情况如图。

接下来我们看一下rx4rx-lite,我们的最小代码库的执行情况:

rx4rx-lite

执行了88ms 我们看到了大量的函数调用,这些都是因为创建了很多闭包的箭头函数。

以上只是说介绍了如何去看性能的方法,实际探索过程中,伴随的是大量的模仿和尝试,最后总结出以下几点:

  1. 调用匿名函数比调用原型链中的函数要慢
  2. 匿名函数调用会产生垃圾回收,GC占用CPU
  3. super关键字调用很慢很慢
  4. 读写临时变量比读写对象属性要慢
  5. 覆盖原型的方法,比直接访问原型的方法要慢
  6. 注意构造函数里面的赋值顺序

产生以上原因主要就是V8引擎在底层的处理有关,比如快速对象(C++类),还有就是尽量避免GC,全局变量和类定义(一回事)不会被轻易GC 最后我们看一下rx4rx-fast 我们的最高性能库的表现:

rx4rx-fast

达到了43.3ms,虽然函数调用较深,但所占CPU极少了。 (未完待续)

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

RxJS的另外四种实现方式(三)——性能最高的库

接上篇RxJS的另外四种实现方式(二)——代码最小的库(续)(https://my.oschina.net/langhuihui/blog/2052019)代码最小的库rx4rxlite虽然在性能测试中超过了callbag,但和most库较量的时候却落败了,于是我下载了most库,要解开most库性能高的原因。我们先上一组测试数据,这是

RxJS的另外四种实现方式(后记)—— 同时实现管道和链式编程

目录RxJS的另外四种实现方式(序)(https://my.oschina.net/langhuihui/blog/2051754)RxJS的另外四种实现方式(一)——代码最小的库(https://my.oschina.net/langhuihui/blog/2051770)RxJS的另外四种实现方式(二)——代码最小的库(续)