Node介绍8-性能

程序完成以后,性能和稳定性又是我们关注的焦点,本文总结一下工作中遇到的性能测试方法,当然这里是针对node。

性能分析是比较困难的工作,如果一个程序很慢,他可能把时间花在了CPU,I/O,网络传输,垃圾回收和一些其他事情。如果我们能找到变慢的地方,并加以改进,那么我们的程序将比竞争对手的优秀。

下面我们就看看有哪些方法可以帮助我们找到性能不佳的模块。

日志

开发app的程序员往往不喜欢使用日志,无论是iOS,Android或者hybrid的开发方案,都有完善的调试机制,IDE更是好用的不行,似乎日志只用在服务器端的程序,嵌入式和驱动开发中才用的到。不过这里想介绍一下日志也可以性能调试,所以给自己的模块打上完整的日志,是一种很好的开发方法。

如果要用日志进行性能分析,必须让日志打印出以下几个要素

  1. 时间
  2. 功能模块
  3. 描述
  4. 进程(线程)Id

我们看一个例子。

在下图中我们可以看到:

  1. 使用notepad++工具打开log。
  2. 按照功能模块搜索。
  3. 在下面们可以看到过滤后的log。这个和grep的功能很像哦。
  4. 通过一行一行的查看(注意只看你过滤的模块),发现在哪里耗时最多。
  5. 比如发现某两行之间耗时2秒,超过预期,我们可以去看完整log,发现在此之间做了哪些操作。
  6. 如果是多进程的系统,也可以根据进程过滤。
log性能分析的例子

使用log的方法需要你可以修改源码,在关心的地方插入log(比如一些生命周期的关键地方,启动结束与显示等等),也需要在团队中推行这种做法,不然log不全,看了也没啥用。

如果log非常全,就需要使用过滤工具去过滤log,grep和nodepad++的过滤功能都很强大。

工具

性能测试的工具很多,总体思想都是图形化调用堆栈,显示占用的事件百分比。

1. Flame Graphs
下面显示的Flame Graphs可以显示出函数占用的时间,应该说是非常好用。

cpu-mixedmode-node
cpu-mixedmode-node

具体的使用方法可以查看这篇博客cpuflamegraphs

2. v8-profiler

var fs = require('fs');
var profiler = require('v8-profiler');
profiler.startProfiling('1', true);
var profile1 = profiler.stopProfiling();
profiler.startProfiling('2', true);
var profile2 = profiler.stopProfiling();

console.log(snapshot1.getHeader(), snapshot2.getHeader());

profile1.export(function(error, result) {
  fs.writeFileSync('profile1.json', result);
  profile1.delete();
});

profile2.export()
  .pipe(fs.createWriteStream('profile2.json'))
  .on('finish', function() {
    profile2.delete();
  });

profiler生成的文件可以用 node-inspector查看

Paste_Image.png

** 3.d8 **
d8工具需要自己编译生成,我们可以看看v8的的代码,弄清楚v8工具以后,我们也可以自己写工具去测试性能,因为实际上v8本身暴露了这些接口。

如果没有d8,node也有类似的功能。

node --prof --prof_lazy app.js

我们看一下最终的结果:
下面可以看到cpu的使用情况,是不是很不错啊。

Statistical profiling result from benchmarks\v8.log, (4192 ticks, 0 unaccounted, 0 excluded).

 [Shared libraries]:
   ticks  total  nonlib   name
      9    0.2%    0.0%  C:\WINDOWS\system32\ntdll.dll
      2    0.0%    0.0%  C:\WINDOWS\system32\kernel32.dll

 [JavaScript]:
   ticks  total  nonlib   name
    741   17.7%   17.7%  LazyCompile: am3 crypto.js:108
    113    2.7%    2.7%  LazyCompile: Scheduler.schedule richards.js:188
    103    2.5%    2.5%  LazyCompile: rewrite_nboyer earley-boyer.js:3604
    103    2.5%    2.5%  LazyCompile: TaskControlBlock.run richards.js:324
     96    2.3%    2.3%  Builtin: JSConstructCall
    ...

 [C++]:
   ticks  total  nonlib   name
     94    2.2%    2.2%  v8::internal::ScavengeVisitor::VisitPointers
     33    0.8%    0.8%  v8::internal::SweepSpace
     32    0.8%    0.8%  v8::internal::Heap::MigrateObject
     30    0.7%    0.7%  v8::internal::Heap::AllocateArgumentsObject
    ...


 [GC]:
   ticks  total  nonlib   name
    458   10.9%

 [Bottom up (heavy) profile]:
  Note: percentage shows a share of a particular caller in the total
  amount of its parent calls.
  Callers occupying less than 2.0% are not shown.

   ticks parent  name
    741   17.7%  LazyCompile: am3 crypto.js:108
    449   60.6%    LazyCompile: montReduce crypto.js:583
    393   87.5%      LazyCompile: montSqrTo crypto.js:603
    212   53.9%        LazyCompile: bnpExp crypto.js:621
    212  100.0%          LazyCompile: bnModPowInt crypto.js:634
    212  100.0%            LazyCompile: RSADoPublic crypto.js:1521
    181   46.1%        LazyCompile: bnModPow crypto.js:1098
    181  100.0%          LazyCompile: RSADoPrivate crypto.js:1628

性能测试工具很多,有了工具以后还需要我们对需要优化的代码比较熟悉,仔细检查,才能找到有可能的几个点,慢慢优化,可以说是一件很费时间的工作。

自己写测试工具

上面的工具虽然好用,但是如果我们自己能写得化岂不是更好,所以我们看看能不能自己写一个。
我们先看看v8-profiler是如何做的
https://github.com/node-inspector/v8-profiler/blob/master/src/cpu_profiler.cc

 v8::CpuProfiler::StartProfiling(title);

好像v8自己有性能分析的模块哦。

我们再打开v8代码。可以看到


v8内部profile机制

所以仿照现有的工具,我们完全可以打造出自己的工具阿。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    w_zhuan阅读 3,603评论 2 41
  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宫若石阅读 1,035评论 0 1
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    Myselfyan阅读 4,057评论 2 58
  • JavaScript绝对是最火的编程语言之一,一直具有很大的用户群,随着在服务端的使用(NodeJs),更是爆发了...
    不去解释阅读 2,387评论 1 16
  • 最近dota2的一部网剧《梦想X计划》悄悄登上了腾讯视频,这是近年来据我所知的第一部有关dota2游戏的网剧,虽然...
    悲伤的魔棒阅读 96评论 0 0