Skip to content
Snippets Groups Projects
Commit eaa8bda8 authored by 조대희's avatar 조대희
Browse files

test: 성능 측정을 위한 로직 추가 (#23)

parent b00d1dc8
Branches
No related tags found
2 merge requests!42[#25] 배포코드 master브랜치로 이동,!36[#23] 스케줄 로직 리팩토링
......@@ -66,6 +66,9 @@ app.use('/api/chat', chatRoutes);
const memberRoutes = require('./routes/memberRoute');
app.use('/api/member', memberRoutes);
const memberRoutes = require('./routes/performanceRoute');
app.use('/api/performance', performanceRoutes);
// 스케줄 클리너 초기화
initScheduleCleaner();
......
// routes/performanceRoute.js
const express = require('express');
const router = express.Router();
const performanceMonitor = require('../utils/performanceMonitor');
router.get('/stats', (req, res) => {
const stats = performanceMonitor.getAllStats();
res.json({
success: true,
data: { stats }
});
});
module.exports = router;
// utils/performanceMonitor.js
const { performance, PerformanceObserver } = require('perf_hooks');
class PerformanceMonitor {
constructor() {
this.measurements = new Map();
// 성능 관찰자 설정
this.observer = new PerformanceObserver((items) => {
items.getEntries().forEach((entry) => {
const measurements = this.measurements.get(entry.name) || [];
measurements.push(entry.duration);
this.measurements.set(entry.name, measurements);
console.log(`Performance Measurement - ${entry.name}: ${entry.duration}ms`);
});
});
this.observer.observe({ entryTypes: ['measure'] });
}
async measureAsync(name, fn) {
const start = performance.now();
try {
return await fn();
} finally {
const duration = performance.now() - start;
performance.measure(name, {
start,
duration,
detail: { timestamp: new Date().toISOString() }
});
}
}
getStats(name) {
const measurements = this.measurements.get(name) || [];
if (measurements.length === 0) return null;
const sum = measurements.reduce((a, b) => a + b, 0);
const avg = sum / measurements.length;
const min = Math.min(...measurements);
const max = Math.max(...measurements);
return {
count: measurements.length,
average: avg,
min: min,
max: max,
total: sum
};
}
getAllStats() {
const stats = {};
for (const [name, measurements] of this.measurements.entries()) {
stats[name] = this.getStats(name);
}
return stats;
}
}
module.exports = new PerformanceMonitor();
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment