60亿次for循环,原来这么多东西( 二 )

更换字符串的拼接方式

  • 我把字符串拼接换成了数组的join方式(此时循环5.9亿次)
var http = require('http');http  .createServer(function(request, response) {    console.log(request.url, 'url');    let used = process.memoryUsage().heapUsed / 1024 / 1024;    console.log(      `The script uses approximately ${Math.round(used * 100) / 100} MB`,      'start',    );    console.time('测试');    let num = 0;    for (let i = 1; i < 590000000; i++) {      num += i;    }    const arr = ['Hello'];    arr.push(num);    console.timeEnd('测试');    used = process.memoryUsage().heapUsed / 1024 / 1024;    console.log(      `The script uses approximately ${Math.round(used * 100) / 100} MB`,      'end',    );    response.end(arr.join(''));  })  .listen(8888);
  • 测试结果 , 发现接口调用的耗时稳定了(注意此时是5.9亿次循环)

60亿次for循环,原来这么多东西

文章插图
 
  • 《javascript高级程序设计》中 , 有一段关于字符串特点的描述 , 原文大概如下:ECMAScript中的字符串是不可变的 , 也就是说 , 字符串一旦创建 , 他们的值就不能改变 。要改变某个变量的保存的的字符串 , 首先要销毁原来的字符串 , 然后再用另外一个包含新值的字符串填充该变量
就完了?
  • 用+直接拼接字符串自然会对性能产生一些影响 , 因为字符串是不可变的 , 在操作的时候会产生临时字符串副本 , +操作符需要消耗时间 , 重新赋值分配内存需要消耗时间 。
  • 但是 , 我更换了代码后 , 发现 , 即使没有字符串拼接 , 也会耗时不稳定
var http = require('http');http  .createServer(function(request, response) {    console.log(request.url, 'url');    let used = process.memoryUsage().heapUsed / 1024 / 1024;    console.log(      `The script uses approximately ${Math.round(used * 100) / 100} MB`,      'start',    );    console.time('测试');    let num = 0;    for (let i = 1; i < 5900000000; i++) {    //   num++;    }    const arr = ['Hello'];    // arr[1] = num;    console.timeEnd('测试');    used = process.memoryUsage().heapUsed / 1024 / 1024;    console.log(      `The script uses approximately ${Math.round(used * 100) / 100} MB`,      'end',    );    response.end('hello');  })  .listen(8888);
  • 测试结果:
  • 现在我怀疑 , 不仅仅是字符串拼接的效率问题 , 更重要的是for循环的耗时不一致
var http = require('http');http  .createServer(function(request, response) {    console.log(request.url, 'url');    let used = process.memoryUsage().heapUsed / 1024 / 1024;    console.log(      `The script uses approximately ${Math.round(used * 100) / 100} MB`,      'start',    );    let num = 0;    console.time('测试');    for (let i = 1; i < 5900000000; i++) {    //   num++;    }    console.timeEnd('测试');    const arr = ['Hello'];    // arr[1] = num;    used = process.memoryUsage().heapUsed / 1024 / 1024;    console.log(      `The script uses approximately ${Math.round(used * 100) / 100} MB`,      'end',    );    response.end('hello');  })  .listen(8888);


推荐阅读