- 测试运行结果:
- for循环内部的i++其实就是变量不断的重新赋值覆盖
- 经过我的测试发现 , 40亿次跟50亿次的区别 , 差距很大 , 40亿次的for循环 , 都是稳定的 , 但是50亿次就不稳定了.
- Node.js的EventLoop:
文章插图
- 我们目前被阻塞的状态:
- 我电脑的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的运行耗时是稳定 , 但是如果是循环次数过多 , 那么就会出现刚才那种情况 , 阻塞严重 , 耗时不一样 。
- 为什么?