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

  • 测试运行结果:
  • for循环内部的i++其实就是变量不断的重新赋值覆盖
  • 经过我的测试发现 , 40亿次跟50亿次的区别 , 差距很大 , 40亿次的for循环 , 都是稳定的 , 但是50亿次就不稳定了.
  • Node.js的EventLoop:

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

文章插图
 
  • 我们目前被阻塞的状态:
  • 我电脑的CPU使用情况
优化方案
  • 遇到了60亿次的循环 , 像有使用多进程异步计算的 , 但是本质上没有解决这部分循环代码的调用耗时 。
  • 改变策略 , 拆解单次次数过大的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 < 600000; i++) {      num++;      for (let j = 0; j < 10000; j++) {        num++;      }    }    console.timeEnd('测试');    const arr = ['Hello'];    console.log(num, 'num');    arr[1] = num;    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);
  • 结果 , 耗时基本稳定 , 60亿次循环总共:
推翻字符串的拼接耗时说法
  • 修改代码回最原始的+方式拼接字符串
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 < 600000; i++) {      num++;      for (let j = 0; j < 10000; j++) {        num++;      }    }    console.timeEnd('测试');    // const arr = ['Hello'];    console.log(num, 'num');    // 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` + num);  })  .listen(8888);
  • 测试结果稳定 , 符合预期:
总结:
  • 对于单次循环超过一定阀值次数的 , 用拆解方式 , Node.js的运行耗时是稳定 , 但是如果是循环次数过多 , 那么就会出现刚才那种情况 , 阻塞严重 , 耗时不一样 。
  • 为什么?
深度分析问题