Javascript ES6课程表现
好的,我读过的基本内容是:ES6类只是糖语法。好的,所以我想从性能水平上检查一下。我已经创建了一个脚本,在这个脚本中,我在一个对象上迭代了n次,这个对象增加了一个内部计数器 我尝试了不同的方法,使用Javascript ES6课程表现,javascript,performance,object,ecmascript-6,benchmarking,Javascript,Performance,Object,Ecmascript 6,Benchmarking,好的,我读过的基本内容是:ES6类只是糖语法。好的,所以我想从性能水平上检查一下。我已经创建了一个脚本,在这个脚本中,我在一个对象上迭代了n次,这个对象增加了一个内部计数器 我尝试了不同的方法,使用new语法、普通对象、对象。创建语法和。。。ES6class语法 我在node中执行了脚本,在windows上执行了v4,在linux上执行了v5和v6。每次结果都相同: 使用new或Object.create的对象速度更快 Closurish法每次服用+/-两次 ES6课程需要10倍以上的时间 现在
new
语法、普通对象、对象。创建语法和。。。ES6class
语法
我在node中执行了脚本,在windows上执行了v4,在linux上执行了v5和v6。每次结果都相同:
使用new或Object.create的对象速度更快
Closurish法每次服用+/-两次
ES6课程需要10倍以上的时间强>
现在的问题:我的测试相关吗?从语法的角度看,我做错了什么吗?或者ES6课程真的很慢
谢谢你的帮助
EDIT:我没有为这段代码使用任何transpiler,只是执行node myFile.js来执行测试
编辑:这是节点6.2.2上的执行结果
closureAlgo : 894ms
closureFunctionAlgo : 400ms
plainObjectAlgo : 861ms
plainObjectCreateAlgo : 336ms
objectAlgo : 335ms
classAlgo : 2684ms
以下是测试代码:
“严格使用”;
//更容易阅读这个大数字!
常数迭代=Math.pow(10,8);
让我;
功能节点(cb){
var begin=process.hrtime();
cb();
var diff=进程.hr时间(开始);
console.log(参数[0].name+':'+Math.round((diff[0]*1000)+(diff[1]/1000000))+“ms”);
}
功能perfWeb(cb){
var begin=performance.now();
cb();
var end=performance.now();
log(Math.round((end-begin))+“ms”);
}
const perf=性能类型!='未定义的'?perfWeb:perfNode;
函数closureAlgo(){
函数计算(){
var计数=0;
返回{
增量:函数(){
计数++;
}
}
}
var calcImpl=calc();
对于(i=0;i
“ES6课程真的很慢”-白色的车通常比红色的车慢吗?“我想你已经回答过了,说ES6课程真的很慢”-他们没有。他们测量了现实生活中永远不会发生的事情——在一次应用程序运行中创建10^8个不同的类。因此,整个结论毫无意义。更不用说微基准标记是复杂的,需要了解js引擎如何在引擎盖下工作。基准测试是一个复杂的过程。需要考虑的参数很多。@NicolasBaptiste由于测试用例不明显,结果不明显。您正在测试不同的操作(包括声明和调用),然后在此基础上得出一些结论。就像:我买了鱼子酱和牛奶,花了50美元->牛奶太贵了。@NicolasBaptiste javascript引擎或不是普通的javascript解释器,但使用复杂的即时编译和运行时优化,因此程序运行时一个函数的性能可能会有所不同。优化器被调优为优化真实世界的代码,因此如果您在没有真实案例场景的情况下进行性能测试,那么您很可能会阻止优化器执行其工作,因此您不会得到正确/有意义的结果。