前言
Node.js 以其高性能和非阻塞 I/O 特性著称,但要充分发挥其性能潜力,需要我们深入理解其运行机制并采用合适的优化策略。
事件循环机制
理解事件循环是优化 Node.js 应用的基础:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| console.log('1');
fs.readFile('test.txt', () => { console.log('2'); setImmediate(() => console.log('3')); });
process.nextTick(() => console.log('4'));
setTimeout(() => console.log('5'), 0);
|
内存管理
避免内存泄漏
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class DataCache { constructor() { this.cache = new Map(); }
add(key, value) { this.cache.set(key, value); }
}
const LRU = require('lru-cache'); const cache = new LRU({ max: 500, maxAge: 1000 * 60 * 5 });
|
V8 垃圾回收
了解 V8 的垃圾回收机制有助于写出更高效的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
function processItems(items) { return items.map(item => ({ ...item, processed: true })); }
const objectPool = [];
function getObject() { return objectPool.pop() || {}; }
function releaseObject(obj) { objectPool.push(obj); }
|
性能监控
使用 Clinic.js
1 2 3 4 5 6 7 8
| npm install -g clinic
clinic doctor -- node server.js
clinic flame -- node server.js
|
关键指标
1 2 3 4 5 6 7 8 9
| const v8 = require('v8'); const os = require('os');
console.log({ heapStatistics: v8.getHeapStatistics(), heapSpaceStatistics: v8.getHeapSpaceStatistics(), cpuUsage: process.cpuUsage(), memoryUsage: process.memoryUsage() });
|
异步优化
Promise.all vs 串行执行
1 2 3 4 5 6 7 8 9 10 11 12 13
| async function serialFetch(urls) { const results = []; for (const url of urls) { results.push(await fetch(url)); } return results; }
async function parallelFetch(urls) { return Promise.all(urls.map(url => fetch(url))); }
|
流式处理大文件
1 2 3 4 5 6 7 8 9 10 11
| const fs = require('fs'); const zlib = require('zlib');
const readStream = fs.createReadStream('largefile.txt'); const writeStream = fs.createWriteStream('largefile.txt.gz'); const gzip = zlib.createGzip();
readStream .pipe(gzip) .pipe(writeStream);
|
集群模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const cluster = require('cluster'); const os = require('os');
if (cluster.isMaster) { const numCPUs = os.cpus().length; for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code) => { console.log(`Worker ${worker.process.pid} 退出`); cluster.fork(); }); } else { const app = require('./app'); app.listen(3000); }
|
总结
Node.js 性能优化是一个系统工程,需要从多个维度入手:
- 深入理解事件循环机制
- 合理管理内存,避免泄漏
- 建立完善的监控体系
- 采用异步编程最佳实践
- 根据场景选择合适的架构模式