UNPKG

@sun-asterisk/sunlint

Version:

☀️ SunLint - Multi-language static analysis tool for code quality and security | Sun* Engineering Standards

312 lines (241 loc) 8.52 kB
# SunLint Performance Optimization Guide ## Overview SunLint v1.3.2 introduces advanced performance optimizations to handle large-scale analysis efficiently, preventing timeouts and memory issues when analyzing projects with thousands of files or extensive rule sets. ## Key Performance Features ### 🚀 Adaptive File Filtering - **Smart Exclusion Patterns**: Automatically excludes performance-heavy directories (`node_modules`, `.next`, `dist`, etc.) - **File Size Limits**: Skips files larger than 2MB by default - **Total File Limiting**: Processes maximum 1000 files per analysis run ### ⚡ Batch Processing - **Rule Batching**: Processes rules in batches of 10 to prevent memory overflow - **File Batching**: Analyzes files in chunks of 50 for better memory management - **Adaptive Concurrency**: Runs maximum 3 batches simultaneously ### 🧠 Memory Management - **Heap Monitoring**: Tracks memory usage and triggers garbage collection at 256MB - **Memory Limits**: Enforces 512MB heap size limit - **Smart Cleanup**: Automatically cleans up resources between batches ### ⏱️ Adaptive Timeouts - **Dynamic Calculation**: Base timeout of 30s + 100ms per file + 1s per rule - **Maximum Cap**: Never exceeds 2 minutes per batch - **Context-Aware**: Adjusts timeouts based on project size and complexity ### 🔄 Error Recovery - **Retry Logic**: Automatically retries failed batches up to 2 times - **Batch Splitting**: Reduces batch size on failure and retries - **Graceful Degradation**: Continues with other batches if one fails ## Configuration Options ### CLI Flags ```bash # Enable high-performance mode (recommended for large projects) sunlint --performance-mode /path/to/project # Adjust batch sizes sunlint --rule-batch-size=5 --file-batch-size=25 /path/to/project # Increase timeouts for very large projects sunlint --timeout=120000 /path/to/project # Disable certain optimizations sunlint --no-file-filtering --no-batching /path/to/project ``` ### Configuration File Create `.sunlint.json` with performance settings: ```json { "performance": { "enableFileFiltering": true, "maxFileSize": 2097152, "maxTotalFiles": 1000, "enableBatching": true, "ruleBatchSize": 10, "fileBatchSize": 50, "maxConcurrentBatches": 3, "enableMemoryMonitoring": true, "maxHeapSizeMB": 512, "baseTimeoutMs": 30000, "maxTimeoutMs": 120000, "enableErrorRecovery": true, "maxRetries": 2 }, "excludePatterns": [ "**/node_modules/**", "**/.next/**", "**/dist/**", "**/build/**", "**/.git/**", "**/coverage/**" ] } ``` ## Performance Scenarios ### Large Node.js Projects ```bash # Analyze a React/Next.js project efficiently sunlint --rules="C001,C005,C019,C029" --exclude="node_modules,.next,dist" ./src # Use preset for common patterns sunlint --preset=nodejs-large ./ ``` ### Monorepo Analysis ```bash # Analyze specific packages only sunlint --include="packages/*/src/**" --exclude="**/node_modules/**" ./ # Parallel analysis of different packages sunlint --rule-batch-size=5 --max-concurrent-batches=2 ./packages ``` ### CI/CD Integration ```bash # Fast analysis for PR checks (essential rules only) sunlint --preset=essential --performance-mode --timeout=60000 ./ # Full analysis for nightly builds sunlint --all --performance-mode --timeout=300000 ./ ``` ## Performance Monitoring ### Built-in Metrics SunLint automatically reports performance metrics: ```bash sunlint --verbose ./large-project # Output includes: # 📦 Filtered 150 files for performance # 🔄 Using 3 rule batches # ⚡ Batch 1/3: 10 rules in 15s # 💾 Memory usage: 245MB heap # 📊 Throughput: 12.5 files/second ``` ### Performance Testing Run the included performance test suite: ```bash npm run test:performance ``` This tests: - Small projects (5-10 files) - Medium projects (20-50 files) - Large project simulation - Stress testing with many rules ## Troubleshooting Performance Issues ### Common Issues and Solutions #### Timeouts ```bash # Symptoms: "Engine heuristic timed out after 30000ms" # Solution: Increase timeouts or enable performance mode sunlint --timeout=60000 --performance-mode ./ ``` #### Memory Errors ```bash # Symptoms: "Maximum call stack size exceeded" # Solution: Reduce batch sizes and enable memory monitoring sunlint --rule-batch-size=5 --file-batch-size=25 ./ ``` #### Slow Analysis ```bash # Symptoms: Analysis takes >5 minutes # Solution: Use file filtering and exclude large directories sunlint --exclude="node_modules,dist,build,.git" --max-files=500 ./ ``` ### Debugging Performance Enable detailed performance logging: ```bash # Enable debug mode for performance analysis DEBUG=sunlint:performance sunlint --verbose ./ # Profile memory usage NODE_OPTIONS="--max-old-space-size=1024" sunlint --performance-mode ./ ``` ## Best Practices ### Project Setup 1. **Use .gitignore patterns**: Exclude the same directories you ignore in git 2. **Targeted analysis**: Focus on source directories (`src/`, `lib/`) rather than entire project 3. **Rule selection**: Use specific rules instead of `--all` for faster analysis ### CI/CD Integration 1. **Staged approach**: Run essential rules on PRs, full analysis on merges 2. **Parallel execution**: Use different jobs for different rule categories 3. **Caching**: Cache analysis results for unchanged files ### Development Workflow 1. **Pre-commit hooks**: Run minimal rule set locally 2. **IDE integration**: Use SunLint ESLint integration for real-time feedback 3. **Regular full scans**: Schedule comprehensive analysis weekly ## Performance Benchmarks ### Typical Performance (SunLint v1.3.2) | Project Size | Rules | Files | Time | Memory | Throughput | |--------------|-------|-------|------|---------|------------| | Small (10 files) | 5 rules | 10 | 2-5s | 50MB | 3-5 files/s | | Medium (50 files) | 10 rules | 50 | 8-15s | 120MB | 4-6 files/s | | Large (200 files) | 20 rules | 200 | 30-60s | 300MB | 4-7 files/s | | Very Large (1000 files) | 30 rules | 1000 | 2-4min | 500MB | 5-8 files/s | ### Comparison with v1.2.0 - **50% faster** analysis on large projects - **70% less memory** usage with batching - **90% fewer timeouts** with adaptive timeouts - **100% more reliable** with error recovery ## Advanced Configuration ### Custom Performance Profiles Create custom profiles for different scenarios: ```json { "profiles": { "ci-fast": { "rules": ["C001", "C005", "C019"], "performance": { "ruleBatchSize": 3, "maxTimeoutMs": 60000, "maxTotalFiles": 200 } }, "security-deep": { "categories": ["security"], "performance": { "ruleBatchSize": 5, "maxTimeoutMs": 180000, "enableMemoryMonitoring": true } } } } ``` ### Integration with Build Tools #### Webpack Plugin Integration ```javascript // webpack.config.js const SunLintPlugin = require('@sun-asterisk/sunlint/webpack-plugin'); module.exports = { plugins: [ new SunLintPlugin({ performanceMode: true, rules: ['C001', 'C005', 'C019'], exclude: ['node_modules', 'dist'] }) ] }; ``` #### ESLint Integration ```javascript // .eslintrc.js module.exports = { plugins: ['@sun-asterisk/sunlint'], rules: { '@sun-asterisk/sunlint/performance-mode': 'warn' }, settings: { sunlint: { performanceMode: true, maxFiles: 500 } } }; ``` ## Future Optimizations ### Roadmap (v1.4.0+) - **Incremental Analysis**: Only analyze changed files - **Distributed Processing**: Multi-core rule execution - **Smart Caching**: Cache AST parsing results - **WebAssembly Rules**: Native speed rule execution - **Streaming Analysis**: Process files as they're read ### Contributing to Performance Help improve SunLint performance: 1. **Report benchmarks**: Share your project analysis times 2. **Profile bottlenecks**: Use Node.js profiler to identify slow operations 3. **Suggest optimizations**: Submit performance improvement PRs 4. **Test edge cases**: Report performance issues with unusual project structures ## Support For performance-related issues: 1. **Enable verbose logging**: `--verbose` flag provides detailed timing 2. **Run performance test**: `npm run test:performance` 3. **Check system resources**: Monitor CPU and memory during analysis 4. **Report issues**: Include project size, rule count, and system specs --- *SunLint Performance Optimization Guide - Version 1.3.2* *Updated: December 2024*