Skip to content

perf(cli): optimize generateSlaveIds to use Set for O(1) lookups #329

Description

@groupsky

Overview

The generateSlaveIds function in parameter-generator.ts currently uses Array.includes() for validation checks, which is O(n) complexity. This can be optimized to O(1) using a Set.

Current Implementation

function* generateSlaveIds(
  range: readonly [number, number],
  defaultAddress?: number,
  filter?: number[]
): Generator<number> {
  // ...
  let idsToYield: number[]
  if (filter !== undefined) {
    idsToYield = filter  // Array
  } else {
    // Creates 247-element array
    idsToYield = Array.from({ length: end - start + 1 }, (_, i) => start + i)
  }
  
  function* yieldIfValid(id: number): Generator<number> {
    if (idsToYield.includes(clamped) && !yielded.has(clamped)) {  // O(n) lookup
      // ...
    }
  }
  
  // Called 3 times for priority IDs
  yield* yieldIfValid(defaultAddress)
  yield* yieldIfValid(1)
  yield* yieldIfValid(2)
}

Performance Impact

  • Current: Up to 3 × 247 = 741 array iterations for priority checks
  • Optimized: 3 × O(1) = 3 Set lookups

Benefits

  • ✅ O(1) validation instead of O(n)
  • ✅ No 247-element array allocation in full range case
  • ✅ Filtered case: O(k) where k = filter size

Reality Check

  • Current bottleneck is Modbus I/O (1000ms+ per test)
  • This optimization saves microseconds of CPU time
  • Priority: Low - nice to have but not critical

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions