agentsqripts
Version:
Comprehensive static code analysis toolkit for identifying technical debt, security vulnerabilities, performance issues, and code quality problems
102 lines (89 loc) • 2.69 kB
JavaScript
/**
* @file Performance analysis index
* @description Export performance analysis functions
*/
const { calculatePerformanceScore } = require('../performance/performanceScoreCalculator');
const { generatePerformanceRecommendations } = require('../performance/performanceRecommendationGenerator');
/**
* Analyze file for performance issues
* @param {string} filePath - Path to file
* @returns {Object} Analysis results
*/
async function analyzeFilePerformance(filePath) {
const fs = require('fs').promises;
try {
const content = await fs.readFile(filePath, 'utf8');
// Basic performance issue detection
const issues = [];
// O(n²) pattern detection - improved patterns
const nestedLoopPatterns = [
/for\s*\([^)]*\)\s*{[^}]*for\s*\([^)]*\)/gs,
/for\s*\([^)]*\)[\s\S]*?for\s*\([^)]*\)/g,
/\.forEach\([^)]*\)[\s\S]*?\.forEach\([^)]*\)/g
];
let hasNestedLoops = false;
for (const pattern of nestedLoopPatterns) {
if (pattern.test(content)) {
hasNestedLoops = true;
break;
}
}
if (hasNestedLoops) {
issues.push({
type: 'nested_loops',
severity: 'HIGH',
category: 'Algorithm',
description: 'Nested loops detected - potential O(n²) complexity',
effort: 3
});
}
// String concatenation in loops - more comprehensive detection
const stringConcatPatterns = [
/for\s*\([^)]*\)[\s\S]*?\w+\s*\+=\s*["'`]/g,
/for\s*\([^)]*\)[\s\S]*?result\s*\+=\s*/g,
/for\s*\([^)]*\)[\s\S]*?str\s*\+=\s*/g,
/\.forEach\([^)]*\)[\s\S]*?\w+\s*\+=\s*/g
];
let hasStringConcat = false;
for (const pattern of stringConcatPatterns) {
if (pattern.test(content)) {
hasStringConcat = true;
break;
}
}
if (hasStringConcat) {
issues.push({
type: 'string_concat',
severity: 'MEDIUM',
category: 'Performance',
description: 'String concatenation in loop detected',
effort: 2
});
}
return {
file: filePath,
issues,
performanceScore: calculatePerformanceScore(issues)
};
} catch (error) {
return {
file: filePath,
issues: [],
performanceScore: 100,
error: error.message
};
}
}
/**
* Generate optimization recommendations
* @param {Array} issues - Performance issues
* @returns {Array} Recommendations
*/
function generateOptimizationRecommendations(issues) {
return generatePerformanceRecommendations(issues, 0, 0);
}
module.exports = {
analyzeFilePerformance,
calculatePerformanceScore,
generateOptimizationRecommendations
};