Hugo-seth / blog

blog
https://hugo-seth.github.io/blog/
32 stars 1 forks source link

【译】Node 6 升级到 Node 8 :真实应用中的性能比较 #11

Open Hugo-seth opened 7 years ago

Hugo-seth commented 7 years ago

原文地址:Upgrading from Node 6 to Node 8: a real-world performance comparison

原文作者:David Gilbertson

Node 8 已经发布了,你听说了没?他们说新版本的速度更快了。

但是没有任何数字的话,更快仅仅只是几个字。

好在我有一个很大的 React 网站运行在 Node 6 上,并且有 2 个小时的空闲。

更新到 Node 8 足够简单 - 只需要十分钟,没有任何的不兼容库。我从这里下载了 macOS 系统的 .pkg 文件,并且安装的很顺利。虽然我需要手动的去删除 usr/local/lib/node_modules/ 目录。

上面进行的很不错,但一会我将会在 Windows 上更新它,估计它将花费 4 天的时间。

PS:我的天!Node 8 在 Windows 上安装的异常成功。没有人工的步骤,没有不兼容的库,没有不久前还需要的乱七八糟的配置

关于网站

下面比较的是一个中等偏大的 React 网站的一个页面的性能。在服务端,它将有一两千个属性的 JSON 对象传递给模板,然后返回包含 2113 个 DOM 节点的 HTML 。

(没错,是有太多的 DOM 节点了。它在手机端整整需要 2 分钟才能解析完,但我处在食物链的底层,并不能做什么改变。而且有一半的节点是隐藏的,仅仅是为了 "SEO" - 甚至让我无法开始)

··············································································································································

我们开始实验吧。

服务端渲染时间

我们从最重要的指标开始,服务器渲染页面所需的时间。

这是在我的大的银色的装有 macOS Sierra 系统的笔记本上测试的,伴随着几 GHz 的嗡嗡声。

2

刚开始的时候,并没有很大的差别,但在第八次的时候,渲染时间趋于稳定了,Node 6 花费了大约 104 ms 完成渲染,而 Node 8 只花了大约 80 ms 。

Node 使渲染时间减少了相当不错的 23 % 。或更具体的说,服务这个网站所需的硬件减少了 23% 。

我将建议我的老板升级到 Node 8 ,并将亚马逊云服务实例从 25 减少到 20 ,然后把第一个月节省的钱捐给 Node.js 基金。

因为我喜欢笑声。(这句话有点迷,原话:Because I enjoy the sound of laughter )

··············································································································································

下面的是同样的测试,但是跑在 React 的测试模式:

3

在运行了几次之后,Node 8 平均减少了大约 31% 。上面这个图表仅仅只是提醒大家将 NODE_ENV 设置成 production 并使用库的生产环境版本是很重要的。

··············································································································································

我不是很确定 Node 8 性能的提高是怎么来的。我认为大部分来自 V8 5.8 。如果你对它怎样工作感兴趣的话,可以看这个很棒的视频

运行一套测试

这一套测试有大约 500 Jest 的测试用例,它们都仅仅是普通的 JavaScript ,大部分调用的都是插入和销毁 React 组件。

4

Node 用时少了 10% 。可能性能的改进远不止上面所表示的,因为 JavaScript 引擎并没有做任何的优化(每一个测试都是新的 Node 进程)。当然前面只是猜测,随时欢迎指正或说明。

Webpack 构建

用 Webpack 构建大约 500 KB JavaScript ,其过程中有不少的磁盘 I/O ,一连串的 Babel 编译和 JS 的压缩混淆。

5

Node 8 减少了 7% 的用时,其它并没有值得说的。

NPM 安装

现在换成 Windows - 最广泛使用 NPM 的操作系统 。

package.json 里有 40 个包;依赖树加起来有 445 个包。

下面第一次测试时,我删除了 npm 缓存和项目目录的 node_modules 文件夹,这样测试时就是从网络上拉取依赖包。

有意思的是 NPM 3 的最快速度是 7 Mbps,而 NPM 5 则达到了 20 Mbps 。

为了增加点乐趣,我还加入了 yarn 作对比。

6

另外对下面这句话的作者说一句:

8

你让我轻笑了起来。但就像 Marcel Marceau 曾经说过,这是一个紧张的笑声,因为我并不知道我在做什么。

··············································································································································

接下来,我在每次运行 npm install 前都先删除 node_modules 文件夹但保留 npm 缓存。我认为这大部分都是磁盘 I/O (从 缓存 复制到项目目录),但很显然不止是复制,因为用时的巨大改善表明了这点。

7

在上面两种情况下,NPM 5 都减少了三分之一的安装用时。并且 Yarn 都显著地更快(在我的需求下不值得切换到 Yarn,但别人就不一定了)。

··············································································································································

朋友们,上面就是我测试的全部图表了。

实话实说,我一开始只是期待 Node 8 可能有几个百分点的性能改进,如果不是在真实项目中测试了,我也不会如此的震惊。能够减少四分之一的服务端渲染时间和三分之一的 NPM 安装用时真的太棒了。

你们做的太棒了,所有的 Node 的贡献者,你们做的真的太棒了。

··············································································································································

当然,Node 8 还有很多新特性。

henryxie2093 commented 6 years ago

想知道服务端渲染页面的时间是用什么记录的