文档章节

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

一个灰
 一个灰
发布于 09/20 00:06
字数 723
阅读 25
收藏 3

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

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

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

const inspector = require('inspector');
const fs = require('fs');
const session = new inspector.Session();
session.connect();
function logStart() {
    console.log(this.name);
    console.log('-----------------------------------------------');
    session.post('Profiler.enable', () => {
        session.post('Profiler.start', () => {
            // invoke business logic under measurement here...

        });
    });
}

function logComplete() {
    console.log('-----------------------------------------------');
    // some time later...
    session.post('Profiler.stop', (err, {
        profile
    }) => {
        // write profile to disk, upload, etc.
        if (!err) {
            fs.writeFileSync('./profile.cpuprofile', JSON.stringify(profile));
        }
    });
}

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极少了。 (未完待续)

© 著作权归作者所有

共有 人打赏支持
一个灰
粉丝 23
博文 26
码字总数 15847
作品 3
南京
高级程序员
RxJS的另外四种实现方式(序)

本文适合人群:了解Rx编程人士、发烧友 - 本文涉及概念:响应型编程、NodeJs、函数式编程 背景 本人自从读过一篇来自Info的《函数式反应型编程(FRP) —— 实时互动应用开发的新思路》后便迷恋...

一个灰
09/15
0
2
RxJS的另外四种实现方式(后记)—— 同时实现管道和链式编程

目录 RxJS的另外四种实现方式(序) RxJS的另外四种实现方式(一)——代码最小的库 RxJS的另外四种实现方式(二)——代码最小的库(续) RxJS的另外四种实现方式(三)——性能最高的库 Rx...

一个灰
09/24
0
0
[译] 使用响应式编程来实现简易版的无限滚动加载

原文链接: hackernoon.com/naive-infin… 本文为 RxJS 中文社区 翻译文章,如需转载,请注明出处,谢谢合作! 如果你也想和我们一起,翻译更多优质的 RxJS 文章以奉献给大家,请点击【这里】...

SangKa
03/07
0
0
RxJS的另外四种实现方式(三)——性能最高的库

接上篇 RxJS的另外四种实现方式(二)——代码最小的库(续) 代码最小的库虽然在性能测试中超过了callbag,但和most库较量的时候却落败了,于是我下载了most库,要解开most库性能高的原因。...

一个灰
09/18
0
0
高手问答第 200 期 — 兼具函数式和响应式编程的 RxJS,了解一下?

OSCHINA 本期高手问答(2018 年 6 月 5 日 — 6 月 11 日)我们邀请到了程墨老师@程墨Morgan 和大家一起讨论关于 RxJS 的问题。 程墨,资深架构师,曾任职于摩托罗拉、雅虎和微软,云鸟配送平台...

局长
06/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Apache 流框架 Flink,Spark Streaming,Storm对比分析

1.Flink架构及特性分析 Flink是个相当早的项目,开始于2008年,但只在最近才得到注意。Flink是原生的流处理系统,提供high level的API。Flink也提供 API来像Spark一样进行批处理,但两者处理...

hblt-j
16分钟前
2
0
Dubbo/HSF在Service Mesh下的思考和方案

开头 Service Mesh这个“热”词是2016年9月被“造”出来,而今年2018年更是被称为service Mesh的关键之年,各家大公司都希望能在这个思潮下领先一步。今天我也分享阿里中间件在这方面的观点,...

Mr_zebra
17分钟前
0
0
用命令卸载Win8 IE9/IE10/IE11浏览器

首先打开,开始---运行-----框里输入cmd,进入命令提示框,将下面的命令复制粘贴到命令框里,然后按下Enter键执行。 执行完命令,必须重启电脑。 卸载IE9的命令: FORFILES /P %WINDIR%\ser...

JackFace
18分钟前
1
0
2018年产品设计协作领域最强黑马居然是它?

我发了一条朋友圈“感谢池子的秘密法宝,我今天终于吃上了女朋友做的晚饭了”并配上香香的绿豆汤,瞬间获得好几十条评论。 “同为设计师,为啥你会这么早回家?” “快扶我起来,我还能画两个...

mo311
19分钟前
0
0
linux安装jdk1.8(rpm方式)

1:下载JDK的URL地址,例如:http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm。这个地址可以去Orcale的官网找到。通过w......

苏牧影子
23分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部