Thomas Kim
Back to Posts
Jan 25, 2025
2 min read

Optimizing Node.js Performance

Performance optimization is crucial for building scalable Node.js applications. Here are some proven strategies to boost your app’s performance.

Use Asynchronous Operations

Always prefer asynchronous operations to avoid blocking the event loop:

// Bad - Blocking const fs = require('fs'); const data = fs.readFileSync('/file.txt', 'utf8'); // Good - Non-blocking const fs = require('fs').promises; const data = await fs.readFile('/file.txt', 'utf8');

Implement Caching

Caching can dramatically improve response times:

const NodeCache = require('node-cache'); const cache = new NodeCache({ stdTTL: 600 }); async function getUser(userId) { // Check cache first const cachedUser = cache.get(`user_${userId}`); if (cachedUser) { return cachedUser; } // Fetch from database const user = await db.users.findById(userId); // Store in cache cache.set(`user_${userId}`, user); return user; }

Use Cluster Module

Leverage multiple CPU cores with the cluster module:

const cluster = require('cluster'); const os = require('os'); const express = require('express'); if (cluster.isMaster) { const numCPUs = os.cpus().length; for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker) => { console.log(`Worker ${worker.process.pid} died`); cluster.fork(); }); } else { const app = express(); app.get('/', (req, res) => { res.send('Hello World!'); }); app.listen(3000); }

Optimize Database Queries

Use indexes and avoid N+1 queries:

// Bad - N+1 query problem const users = await User.findAll(); for (const user of users) { user.posts = await Post.findAll({ where: { userId: user.id } }); } // Good - Single query with include const users = await User.findAll({ include: [{ model: Post }] });

Monitor and Profile

Use tools like clinic.js or built-in profiling:

# Install clinic.js npm install -g clinic # Profile your application clinic doctor -- node app.js

Conclusion

Performance optimization is an ongoing process. Start with these techniques and continuously monitor your application to identify bottlenecks.

Related

© 2025 Thomas Kim