Skip to content

Benchmark Method ​

The benchmark() method measures the performance characteristics of collection operations, providing detailed timing, memory usage, and algorithmic complexity information. This is particularly useful for optimizing performance-critical operations in large datasets.

Basic Syntax ​

typescript
async benchmark(): Promise<{
  timing: Record<string, number>     // Operation execution times in milliseconds
  memory: Record<string, number>     // Memory usage in bytes
  complexity: Record<string, string> // Big O notation for each operation
}>

Examples ​

Basic Usage ​

typescript
import { collect } from 'ts-collect'

const collection = collect([1, 2, 3, 4, 5])

const metrics = await collection
  .map(x => x * 2)
  .filter(x => x > 5)
  .benchmark()

console.log(metrics)
// {
//   timing: {
//     map: 0.05,
//     filter: 0.03
//   },
//   memory: {
//     map: 240,
//     filter: 120
//   },
//   complexity: {
//     map: 'O(n)',
//     filter: 'O(n)'
//   }
// }

Working with Objects ​

typescript
interface DataPoint {
  id: number
  value: number
}

const data = collect<DataPoint>([
  { id: 1, value: 100 },
  { id: 2, value: 200 },
  { id: 3, value: 300 }
])

const performanceMetrics = await data
  .sortBy('value')
  .map(item => ({ ...item, squared: item.value ** 2 }))
  .benchmark()

// Check performance of different operations
console.log('Sort Performance:', performanceMetrics.timing.sort)
console.log('Memory Usage:', performanceMetrics.memory.sort)
console.log('Algorithmic Complexity:', performanceMetrics.complexity.sort)

Real-world Example: E-commerce Performance Analysis ​

typescript
interface Product {
  id: string
  name: string
  price: number
  category: string
  tags: string[]
}

class CatalogPerformanceAnalyzer {
  private catalog: Collection<Product>

  constructor(products: Product[]) {
    this.catalog = collect(products)
  }

  async analyzeOperations() {
    const results: Record<string, any> = {}

    // Benchmark category grouping
    results.categoryGrouping = await this.catalog
      .groupBy('category')
      .map(group => ({
        category: group.first()?.category,
        count: group.count(),
        averagePrice: group.avg('price')
      }))
      .benchmark()

    // Benchmark search operations
    results.searchOperations = await this.catalog
      .filter(p => p.tags.includes('bestseller'))
      .sortBy('price')
      .take(10)
      .benchmark()

    // Analyze and format results
    return this.formatBenchmarkResults(results)
  }

  private formatBenchmarkResults(results: Record<string, any>) {
    return {
      categoryAnalysis: {
        executionTime: results.categoryGrouping.timing,
        memoryUsage: this.formatMemoryUsage(results.categoryGrouping.memory),
        complexity: results.categoryGrouping.complexity
      },
      searchAnalysis: {
        executionTime: results.searchOperations.timing,
        memoryUsage: this.formatMemoryUsage(results.searchOperations.memory),
        complexity: results.searchOperations.complexity
      }
    }
  }

  private formatMemoryUsage(bytes: number): string {
    return `${(bytes / 1024).toFixed(2)} KB`
  }
}

Type Safety ​

typescript
interface MetricData {
  timestamp: Date
  value: number
}

const metrics = collect<MetricData>([
  { timestamp: new Date(), value: 100 },
  { timestamp: new Date(), value: 200 }
])

// Type-safe benchmarking
type BenchmarkResult = Awaited<ReturnType<typeof metrics.benchmark>>
const result: BenchmarkResult = await metrics
  .sortBy('value')
  .map(m => ({ ...m, normalized: m.value / 100 }))
  .benchmark()

Return Value ​

  • Returns a Promise resolving to an object containing:
    • timing: Record of execution times for each operation
    • memory: Record of memory usage for each operation
    • complexity: Record of Big O notation for each operation
  • All timing measurements in milliseconds
  • Memory measurements in bytes
  • Complexity analysis based on algorithm characteristics
  • Maintains type safety through generics

Common Use Cases ​

1. Performance Optimization ​

  • Identifying bottlenecks
  • Measuring operation costs
  • Comparing algorithms
  • Optimizing memory usage
  • Profiling complex operations

2. Capacity Planning ​

  • Load testing
  • Resource estimation
  • Scaling decisions
  • Performance budgeting
  • Infrastructure planning

3. Development Monitoring ​

  • Development benchmarks
  • Performance regression testing
  • Code optimization
  • Memory leak detection
  • Operation profiling

4. Query Optimization ​

  • Query performance analysis
  • Index effectiveness
  • Operation cost comparison
  • Memory usage optimization
  • Algorithm selection

5. System Health Checks ​

  • Performance monitoring
  • Resource utilization
  • Operation efficiency
  • Memory consumption
  • Runtime analysis

Released under the MIT License.