文档章节

Nodejs下的ES6兼容性与性能分析

ouven
 ouven
发布于 2015/12/09 11:00
字数 1241
阅读 7329
收藏 45
点赞 3
评论 13

ES6标准发布后,前端人员也开发渐渐了解到了es6,但是由于兼容性的问题,仍然没有得到广泛的推广,不过业界也用了一些折中性的方案来解决兼容性和开发体系问题,但大家仍很疑惑,使用ES6会有哪些兼容性问题。

一、Nodejs下ES6兼容性现状

  之前写了es6通过Babel编译后的在浏览器端的兼容性问题《Babel下的ES6兼容性和规范》,随着范围的扩展,ES6在Nodejs上兼容性也有必要重新梳理下。   随着iojs的引入,新版的Nodejs开始原生支持部分ES6的特性,既然ES6在浏览器端使用需要使用babel等编译,在Nodejs总可以放心使用了吧。然而事实并非如此,为此在nodejs端,我也做了特性兼容性研究:

ES6新特性在Nodejs下的兼容性列表 这里罗列下nodejs支持的新特性,没列出的新特性均为不支持。

https://iojs.org/en/es6.html https://kangax.github.io/compat-table/es6/

ES6特性Nodejs兼容性
let,const,块strict模式支持
class类strict模式支持
Map,Set 和 WeakMap,WeakSet支持
generators支持
进制转换支持
对象字面量扩展支持
promise支持
String对象新API支持
symbols支持
字符串模板支持

可见,es6的新特性在Nodejs中比babel还要差,而新版的babel已经能够支持es6的90%新特性了~

二、Nodejs ES6性能分析

  尽管目前Node下使用ES6我们仍然会大失所望,但es6发展的趋势定是必然,这里还是有必要对ES6的原生性能做了详细的对比测试。测试基本方法:

1,对于重复操作循环执行100万次 2,所有程序运行在Nodejs下执行 3,环境描述

  • CPU: Interl(R) Core(Tm) i5-3470 CPU @ 3.2GHz
  • 内存:4.00GB
  • 操作系统: 64位操作系统
  • node版本:node v5.1.1

2.1、let, const, 块


'use strict'
let i = 0;
let t1 = +new Date(),
    t2;

while(i++ < 1000000){
    const a = 1;
    const b = '1';
    const c = true;
    const d = {};
    const e = [];
}

t2 = +new Date() - t1;
console.log(t2);

运行次数ES5运行时间ES6运行时间
100万52-53ms33-34ms

结果让我震惊了,使用let,const声明变量的速度竟然比var快了约65%左右。原因可能是使用var会去检查作用域上的同名变量,而使用let或const不用考虑。

2.2、class类使用


'use strict'
let i = 0;
let t1 = +new Date(),
    t2;

while(i++ < 100000){
    class A{
        constructor() {
           this.name = 'ouven';
        }
        getName(){
            return this.name;
        }
    }

    const a = new A();
    a.getName();
}

t2 = +new Date() - t1;
console.log(t2);

运行次数ES5运行时间ES6运行时间
10万1179-1211ms1411-1442ms

可见使用Nodejs的Class比ES的function构造方法慢约25%

2.3、Map,Set 和 WeakMap,WeakSet


'use strict'
let i = 0;
let t1 = +new Date(),
    t2;

while(i++ < 1000000){
    
    let map = new Map();
    map.set('key','value');
}

t2 = +new Date() - t1;
console.log(t2);


运行次数ES5运行时间ES6运行时间
100万11-13ms179-180ms

测试结果看,Map的效率相对普通的对象key-value的结果相比慢的多,但是Map的Key可以使负责类型,这里的参考性也就不是绝对准确。建议是不到必须情况,不要使用Map等复杂类型。Set、WeakMap、WeakSet均相对object结构执行效率慢得多。

2.4、字符串模板


'use strict'
let i = 0;
let t1 = +new Date(),
    t2;

let vars = {
    name: 'ouven',
    address: 'tencent'
};

while(i++ < 1000000){

    let str = `string text ${vars.name} string ${vars.address}`;
    
}

t2 = +new Date() - t1;
console.log(t2);


运行次数ES5运行时间ES6运行时间
100万8ms59-61ms

ES6的字符串模板看起来很好,但是由于执行时必须扫描这个串,找出里面的模板变量,所以整体上性能就相对ES5的字符串拼接慢了很多。

其它的特性实现有兴趣的同学可以自己继续研究。相信结果大概可以预测到。

测试用例代码地址

三、小结

  这里选择了ES6中的少数特性和ES5的实现的执行效率做了对比,整体上说,ES6的新特性相对ES5的实现效率慢些,而有些特性当然是ES5无法实现的。所以在了解使用ES6的同时,除了了解它的新特性和优点,对于ES6本身的一些问题也要做到心中有数。当然,随着ES6的完善和Node的更新,相信这些也不会是大的问题,而且这些也不会影响ES6的发展。

  https://github.com/ouvens/ecmaScript-2015-babel-rules

原文链接:https://ouvens.github.io/frontend-javascript/2015/12/06/es6-in-nodejs.html

© 著作权归作者所有

共有 人打赏支持
ouven

ouven

粉丝 105
博文 30
码字总数 77829
作品 0
深圳
高级程序员
加载中

评论(13)

爱你美wx
爱你美wx
es6
冰力
冰力
性能差到家了。。。。用来干嘛?
笔阁
笔阁
推荐一些node.js的免费学习内容。
http://www.hubwiz.com/course/?type=nodes
ouven
ouven
该测试不严谨,后面会重新测试~
dolloyo
dolloyo
//ES5:
var str1 = "Template Strings",
str2 = "ES6".
result;
String.prototype.replaceAll = function(oldStr, newStr){
return this.split(oldStr).join(newStr);
}
result = "${str1} is amazing, " +
"and we can use ${str1} in ${str2}".replaceAll("${str1}", str1).replaceAll("${str2}", str2);

//ES6:
let [str1, str2, result] = ["Template Strings", "ES6", null];
result = `${str1} is amazing,
and we can use ${str1} in ${str2}`;

字符串模板的两个特性在这里了。
BuN_Ny
BuN_Ny

引用来自“BuN_Ny”的评论

字符串模板至少也应该测试和 foo.split('${x}').join(data)的差距。和 'foo' + bar 这种比,没什么意义。

引用来自“ouven”的评论

比 + 都慢了,join就不用比了,这里我想表达的是,字符串模板其实真的有必要吗?而且还不好解决xss问题...
你对每项特性是在什么样的应用场景下催生出来的,还不是很了解啊。所以做不出合理的测试也是正常。
Frank_mc
Frank_mc
博主的兼容性是以iojs的为准,现在合并后更新到5.2兼容性又加强了很多
请参考 https://nodejs.org/en/docs/es6/
ouven
ouven

引用来自“jayU”的评论

比如 map 的测试
你测试的不是 map 的性能
而且实例化对象的性能
这和实际场景中的使用是完全不一样的
嗯,是的,这里限于环境的原因不好对比测试,严谨的对比测试不大好做,回头重新改下测试策略
ouven
ouven

引用来自“BuN_Ny”的评论

字符串模板至少也应该测试和 foo.split('${x}').join(data)的差距。和 'foo' + bar 这种比,没什么意义。
比 + 都慢了,join就不用比了,这里我想表达的是,字符串模板其实真的有必要吗?而且还不好解决xss问题...
BuN_Ny
BuN_Ny
字符串模板至少也应该测试和 foo.split('${x}').join(data)的差距。和 'foo' + bar 这种比,没什么意义。
张成文——ECMAScript 6 开发体系实践

2016年04月23日14:00時,在武汉市东湖高新技术开发区民院路38号纽宾凯鲁广国际酒店(光谷步行街地铁C出口省测绘局斜对面),舉行的规模在800人左右的2016源创会武汉站。由张成文(腾讯SNG web)分...

yunwangjun ⋅ 2016/04/24 ⋅ 1

ES6与CommonJS中的模块处理

ES6和CommonJS都有自己的一套处理模块化代码的措施,即JS文件之间的相互引用。 为了方便两种方式的测试,使用nodejs的环境进行测试 CommonJS的模块处理 使用require来引入其他模块的代码,使...

zsfblank ⋅ 06/12 ⋅ 0

Node.js v6 LTS 杂谈(一):LTS 与 Node.js 的版本、分支

原作者:洗影 2016 年 10 月 18 日,Node.js v6 LTS (Boron) 发布,这也是 Node.js 启用 LTS 发布计划以来,第一次同时迎来两个 active LTS(v4 与 v6)。这系列文章将讲述 Node.js v6 LTS 带...

_朴灵_ ⋅ 05/14 ⋅ 0

koahubjs 1.0.0 发布,基于 Koa.js 快速开发框架

koahubjs 发布 1.0.0 正式版,基于 Koa.js 的快速开发框架。 KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架。可以直接在项目里使用 ES6/7(Generator Function, Class, Async ...

einsqing ⋅ 2017/01/07 ⋅ 6

2015-2016前端知识体系

本文作者总结了这两年前端的主流技术,对应技术博客地址:http://ouvens.github.io 一、框架与组件 bootstrap等UI框架设计与实现 伸缩布局:grid网格布局 基础UI样式:元素reset、按钮、图片...

数通畅联 ⋅ 2016/03/30 ⋅ 0

2015-2016前端知识体系

一、框架与组件 bootstrap等UI框架设计与实现 伸缩布局:grid网格布局 基础UI样式:元素reset、按钮、图片、菜单、表单 组件UI样式:按钮组、字体图标、下拉菜单、输入框组、导航组、面包屑、...

情人情人 ⋅ 2016/03/29 ⋅ 0

展望Nodejs 2016和新年祝福

展望Nodejs 2016和新年祝福 《素书》里讲“推古验今,所以不惑”,所以我们先回顾一下2015年nodejs的国内外发展,继而展望一下我的2016年关于nodejs的想法和新年祝福 回顾一下2015年 http:/...

i5ting ⋅ 2016/02/08 ⋅ 6

如何使用koa2+es6/7打造高质量Restful API

前言 如今nodejs变得越来越火热,采用nodejs实现前后端分离架构已被多数大公司所采用。 在过去,使用nodejs大家首先想到的是TJ大神写的express.js,而发展到如今,更轻量,性能更好的koa已然...

Jack088 ⋅ 06/12 ⋅ 0

ECMAScript 6 学习笔记(1)--编译环境搭建(VScode)

参考文档:http://es6.ruanyifeng.com/#docs/intro https://www.w3cschool.cn/ecmascript/ ECMAScript是一种定义脚本语言的规范,Javascript正是基于这种规范的一种实现。JavaScript是一种弱...

wx599c47c7bdcad ⋅ 05/18 ⋅ 0

Skywalking Node.js 探针 0.1.0 版本正式发布

项目介绍: Skywalking Node.js探针0.1.0版本正式发布了. Skywalking Node.js探针是由Skywalking社区提供专门针对Node.js生态下的后端应用提供的自动探针。 Skywalking Node.js探针遵守Skywa...

Xin_Zhang_BJ ⋅ 05/21 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 52分钟前 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 今天 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

【转】JS浮点数运算Bug的解决办法

37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只有一位小数的数字相乘,怎...

NickSoki ⋅ 今天 ⋅ 0

table eg

user_id user_name full_name 1 zhangsan 张三 2 lisi 李四 `` ™ [========] 2018-06-18 09:42:06 星期一½ gdsgagagagdsgasgagadsgdasgagsa...

qwfys ⋅ 今天 ⋅ 0

一个有趣的Java问题

先来看看源码: public class TestDemo { public static void main(String[] args) { Integer a = 10; Integer b = 20; swap(a, b); System.out......

linxyz ⋅ 今天 ⋅ 0

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 今天 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 9

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部