从Deno跟Node的性能对比说起

今年五月份Deno发布了1.0版本,作为一个经常用Node来构建项目的前端,对Deno官网描述的那几点优点其实并不太关心(Deno优点)。主要还是想知道Deno的性能怎么样,用Deno能不能大幅减少前端构建项目的耗时。对网络上Deno能不能替代Node的讨论也比较感兴趣,于是便用Deno跟Node去执行一些常用的方法,比较它们的性能,研究下Deno是否可以替代Node。

Deno简介

Deno是一个JavaScript和TypeScript运行时,跟Node、Java一样可以运行在服务器上。

测试信息

Node版本v14.6.0(v8-8.4.371.19),Deno版本1.1.0(v8-8.4.300)。

执行结果是执行了5次相同方法取的范围。

第三方库用了spark-md5、js-base64、acorn、estraverse和escodegen。

用sort排序数组(数组长度为20万)

console.time("sort-array");
dataArray.sort((a, b) => {
  return a - b;
});
console.timeEnd("sort-array");

node:84.645ms-103.086ms

deno:134ms-140ms

md5(文件大小为2.6M)

console.time("md5");
spark.append(data);
console.log(`md5: ${spark.end()}`);
console.timeEnd("md5");

node 33.559ms-41.608ms

deno 63ms-83ms

base64(文件大小为2.6M)

console.time("Base64");
Base64.encode(data);
console.timeEnd("Base64");

node 572.197ms-662.004ms

deno 1216ms-1269ms

斐波那契数列(n=40)

function fib(n) {
  if (n === 0) {
    return 0;
  } else if (n === 1) {
    return 1;
  } else {
    return fib(n - 1) + fib(n - 2);
  }
}
console.time("fib");
fib(40);
console.timeEnd("fib");

node 1.286s-1.343s

deno 1447ms-1616ms

for in遍历对象(10万个属性)

console.time("for in");
for (let k in dataObject) {
  total += dataObject[k].list[0].n;
}
console.timeEnd("for in");

node 49.773ms-65.803ms

deno 41ms-49ms

JSON 序列化(10万个属性)

console.time("JSON");
let result = JSON.parse(JSON.stringify(dataObject));
console.timeEnd("JSON");

node 345.198ms-376.225ms

deno 173ms-192ms

自定义loader(生成了大概202个文件)

webpack打包项目中loader占用的时间挺多的,而最常用的babel-loader简单说是把文件转换成AST,处理AST之后再重新返回。我们可以模拟下这个过程。

我的做法是复制acorn、estraverse和escodegen这三个文件,把这三个文件改成Deno可以引用的形式。然后自定义loader的代码处理逻辑Node跟Deno一样,都是读取目录下面的所有js文件,给所有js文件的函数名增加了一个自定义后缀,最后把重新生成的js文件输出到一个目录里。

node 2.371s-2.555s

deno 2057ms-2417ms

上面所有的测试代码都在这里,测试的结果应该会不同,但差异幅度应该是准确的。大家可以用自己的电脑跑跑看。

性能比对分析

从上面的数据我们可以看到Node在数组排序、对象遍历、函数递归调用、md5计算、base64编码的测试表现会好一点,而在JSON序列化、自定义loader的测试中Deno要表现更好。

用webpack打包的话,自定义loader的测试比重应该是比其他项高的,所以Deno如果用来打包项目应该还是有一定提升的,从数据上看最高能提升20%左右。当然,这个结论并不准确,实际开发中webpack的处理还是比较复杂的,真正准确的对比还是要用Deno实现一个webpack。但就算是按20%的提升来说,也是太少了,不足以让人放弃webpack的生态。比如说Rollup跟Parcel都曾经宣传打包效率比webpack高很多,但他们现在都无法撼动webpack在构建工具中的领袖地位。

所以说先发优势还是很重要的,现在Node的服务端框架有Express、构建工具有webpack、桌面端应用有electron,这些都是比较成熟的应用。Deno的实现如果没有高性能的优势还是很难去替代Node的。而且从Deno官网文档看到的是想替代Python的部分场景,而不是Node。详见这里。(谁叫Python那么慢呢^ ^)

Deno使用体验

首先Deno能直接执行typescript文件,不需要先用tsc进行编译。函数默认返回promise,可以直接使用await。支持import()跟web worker,使用体验跟在浏览端还是有点像的,容易上手。

总得来说使用体验还是挺好的,比起Node的话就是省去了构建的功夫。

但Deno目前并不成熟,一些API还不稳定,提供的API也太少了,一些Node上提供的便捷方法只能自己重新实现。而且还有部分还实现不了,比如os模块的一些方法(这个issue列出了一些不支持的方法)。第三方模块也还比较少,目前只有786个。具体可以查看这里

所以说虽然Deno发布了1.0版本,但是距离生产使用还是要再等一段时间的(不确定具体时间,感觉要等个3、5年吧= =)。

总结

  1. 考虑重构成本跟生态强度,Deno的性能如果没有比Node高出很多是难以替代Node的。
  2. Deno应该也能抓住一部分用户,对Deno优点感兴趣的朋友也有不少,而且Deno的学习成本还是相对比较低的(用过Node的话)。
  3. 由于Deno目前的生态还不成熟,系统方法跟第三方库都还比较少,所以现在不建议企业公司在生产环境使用Deno。什么时候能用还是要看Deno生态的发展情况。

转载标明出处即可。

你可能感兴趣的:(node.js,deno)