| name | koan-performance |
| description | Streaming, pagination, count strategies, bulk operations |
Koan Performance
Core Principle
Optimize for scale from day one. Use streaming for large datasets, batch operations for bulk changes, fast counts for UI, and pagination for web APIs.
Performance Patterns
Streaming (Large Datasets)
var allTodos = await Todo.All();
await foreach (var todo in Todo.AllStream(batchSize: 1000))
{
await ProcessTodo(todo);
}
Count Strategies
var fast = await Todo.Count.Fast(ct);
var exact = await Todo.Count.Exact(ct);
var optimized = await Todo.Count;
Use Fast for: Pagination UI, dashboards, estimates
Use Exact for: Critical business logic, reports, inventory
Bulk Operations
var todos = Enumerable.Range(1, 1000)
.Select(i => new Todo { Title = $"Task {i}" })
.ToList();
await todos.Save();
await Todo.RemoveAll(RemoveStrategy.Fast);
Batch Retrieval
foreach (var id in ids)
{
var todo = await Todo.Get(id);
}
var todos = await Todo.Get(ids);
Pagination
public async Task<IActionResult> GetTodos(
int page = 1,
int pageSize = 20,
CancellationToken ct = default)
{
var result = await Todo.QueryWithCount(
t => !t.Completed,
new DataQueryOptions { OrderBy = nameof(Todo.Created), Descending = true },
ct);
Response.Headers["X-Total-Count"] = result.TotalCount.ToString();
return Ok(result.Items);
}
Performance Benchmarks
| Operation | Inefficient | Efficient | Speedup |
|---|
| Bulk Remove (1M) | DELETE loop ~45s | TRUNCATE ~200ms | 225x |
| Count (10M) | Full scan ~25s | Metadata ~5ms | 5000x |
| Batch Get (100) | 100 queries | 1 query | 100x |
| Stream (1M) | Load all (OOM) | Stream batches | Memory safe |
When This Skill Applies
- ✅ Performance tuning
- ✅ Large datasets
- ✅ Optimization
- ✅ Production readiness
- ✅ Memory issues
- ✅ Query optimization
Reference Documentation
- Example Code:
.claude/skills/entity-first/examples/batch-operations.cs
- Guide:
docs/guides/performance.md
- Sample:
samples/S14.AdapterBench/ (Performance benchmarks)