let性能差很多呢,大家说说看要不要改成let
发布于 8 年前 作者 pleasenter 6436 次浏览 来自 问答

先上代码: //测试let和var的性能区别,let比var还是要慢很多; /*var start = new Date(); for (var i = 0; i < 10000000; i++) { var num = 123; var str = ‘abc’; var obj = { key: ‘value’ }; var arr = [‘bill’, ‘dell’]; } var end = new Date(); */ let start = new Date(); for (let i = 0; i < 10000000; i++) { let num = 123; let str = ‘abc’; let obj = { key: ‘value’ }; let arr = [‘bill’, ‘dell’]; } let end = new Date();

console.log(end - start);

上面的测试,用let比var差了大概3倍,就是说let所用的时间是var的三倍。 那么我们用let代替var值得吗?特别是nodejs这种特别注重性能的服务器程序。

19 回复

代码写的好逻辑清晰,var完全没有问题。但是如果逻辑很复杂,let的块级作用域会帮你大忙~

为什么我在浏览器执行的结果和楼主刚好相反啊? 在node环境下var还是稍微快点:

'use strict'
const Benchmark = require('benchmark')
const suite = new Benchmark.Suite

function letEL() {
    for (let i = 0; i < 10000000; i++) {
        let num = 123;
        let str = 'abc';
        let obj = {
            key: 'value'
        };
        let arr = ['bill', 'dell'];
    }
}

function varEL(){
    for (var i = 0; i < 10000000; i++) {
        var num = 123;
        var str = 'abc';
        var obj = {
            key: 'value'
        };
        var arr = ['bill', 'dell'];
    }
}

suite
    .add('#letEL',() => {
        letEL()
    })
    .add('#varEL',() => {
        varEL()
    })
    .on('cycle',event => {
        console.log(event.target + '')
    })
    .on('complete',function(){
        console.log(`Fastest is ${this.filter('fastest').map('name')}`)
    })
    .run({async:true})

QQ20161009-0.png

这种测试方法不够严谨

@gjc9620 那怎么才算严谨呢?

感觉这已经是很基础的用法了,这个方式差了3倍那就是真的有差距。

@solee0524 如果是初学者用let确实会严谨很多,但是以前没let的时候,js还不是一样的蓬勃发展,说明var还是够用的。

@gjc9620 为什么你这种测试感觉差距不大,我测出来真有三倍的差距,我的机器上var是80左右,let是250左右。

不要担心,写好代码就行。 这些东西会随着引擎优化

来自酷炫的 CNodeMD

@xueyou2000 豁然开朗😆 From Noder

跟 V8 的实现有关吧,不过未来 let 的性能肯定比 var 好。

Chrome 53 控制台的测试结果:

console.time('timer1')
for (var i = 0; i < 10000000; i++) {
  var num = 0
  var str = ''
  var obj = { a: 'a' }
  var arr = []
}
console.timeEnd('timer1')
console.time('timer2')
for (let i = 0; i < 10000000; i++) {
  let num = 0
  let str = ''
  let obj = { a: 'a' }
  let arr = []
}
console.timeEnd('timer2')
// VM1496:8 timer1: 295.353ms
// VM1496:17 timer2: 140.365ms

Node6.6 REPL 的测试结果

console.time('timer1')
for (var i = 0; i < 10000000; i++) {
  var num = 0
  var str = ''
  var obj = { a: 'a' }
  var arr = []
}
console.timeEnd('timer1')
// timer1: 298.765ms
console.time('timer2')
for (let i = 0; i < 10000000; i++) {
  let num = 0
  let str = ''
  let obj = { a: 'a' }
  let arr = []
}
console.timeEnd('timer2')
// timer2: 3499.564ms

绝大多数人写js应该还没有严格到需要研究varlet到底哪个性能更好。把代码写的漂亮,逻辑清晰,扩展性好,才是首要的吧…当然,有怀疑精神是非常值得肯定的

一直保持使用最新得

@pleasenter

之前我也有这疑问 https://cnodejs.org/topic/568b1f503b33070b6627089b

最后还是使用let了,使用let可以避免大部分不必要的错误和歧义,性能的话还是交给引擎去解决吧

能用 const 尽量用 const

@xadillax 说到const我就有点糊涂了,求教一下。 一般来说,我 const path = require(‘path’); 是没有问题的吧?

在express的router里面呢? const express = require(‘express’); const router = express.Router(); 这样好像也没什么问题吧?

那const的不可变是怎么理解?

@klausgao const是不改变其引用

const obj = {a:1};
//错误
obj = {a:2};
//正确
obj.a = 2;

@klausgao 具体就是,对于对象,例如楼上的举例子的对象使用方法, 指的是对象的指向不可变, 但是属性值什么的还是可以更改的, 再比如常量const a = 2; 此时 a = 3就会报错, 是不能直接更改的. 我的理解是const 声明的变量 对于对象obj,指的是对象指向的存储地址不变就行, 对于常量a 就是a指向的值不变即可!

可维护性比性能重要得多, 性能有问题可以加台服务器就搞定,已经上线的代码如果因为全局变量的问题找不到出原因,解决不了bug,那就只能哭了

循环一亿次能差出来1秒,除非是死循环否则没必要这样吧? 另外代码写的也有问题,试试这段代码,性能几乎相当,我测试是var稍微慢点

const timeVar = () => {
  console.time('var');
  for (var i = 0; i < 10000000; i++) {
    var num = 123;
    var str = 'abc';
    var obj = {
      key: 'value'
    };
    var arr = ['bill', 'dell'];
  }
  console.timeEnd('var');
};

const timeLet = () => {
  console.time('let');
  for (let i = 0; i < 10000000; i++) {
    let num = 123;
    let str = 'abc';
    let obj = {
      key: 'value'
    };
    let arr = ['bill', 'dell'];
  }
  console.timeEnd('let');
};

timeVar();
timeLet();
回到顶部