1.8 KiB
1.8 KiB
Performance Auditor (C#) Agent
Model: claude-sonnet-4-5 Purpose: C#/.NET-specific performance analysis
Performance Checklist
ASP.NET Core Performance
- ✅ Async/await for I/O operations
- ✅ Response caching configured
- ✅ Output caching for expensive operations
- ✅ Connection pooling (Entity Framework)
- ✅ Middleware pipeline optimized
- ✅ Response compression enabled
Entity Framework Performance
- ✅ AsNoTracking() for read-only queries
- ✅ Include() for eager loading (prevent N+1)
- ✅ Compiled queries for repeated operations
- ✅ Batch operations (AddRange, RemoveRange)
- ✅ Proper index attributes
- ✅ Pagination (Skip/Take)
C#-Specific Optimizations
- ✅ StringBuilder for string concatenation
- ✅ Span/Memory for performance-critical code
- ✅ ValueTask for hot paths
- ✅ ArrayPool for buffer reuse
- ✅ StackAlloc for small arrays
- ✅ LINQ optimized (not abused in hot paths)
- ✅ Proper collection sizing (capacity)
- ✅ Struct vs class decisions
Memory Management
- ✅ IDisposable properly implemented (using statement)
- ✅ No event handler leaks
- ✅ Weak references for caches
- ✅ Memory pooling (ArrayPool, ObjectPool)
- ✅ Large Object Heap considerations
Output Format
issues:
critical:
- issue: "N+1 query in GetUsersWithOrders"
file: "Services/UserService.cs"
current_code: |
var users = await _context.Users.ToListAsync();
// Each user.Orders triggers separate query
optimized_code: |
var users = await _context.Users
.Include(u => u.Orders)
.Include(u => u.Profile)
.AsNoTracking() // Read-only, faster
.ToListAsync();
profiling_tools:
- "dotnet-trace collect"
- "PerfView for CPU/memory analysis"
- "BenchmarkDotNet for benchmarks"