Skip to content

perf: reduce provider clone overhead in skill embedding #400

@bug-ops

Description

@bug-ops

Problem

Every skill embedding creates 2-3 provider clones due to closure capture patterns. With 50 skills and buffer_unordered(50), this creates 100+ simultaneous provider clones.

File: crates/zeph-core/src/agent/mod.rs lines 743-747, crates/zeph-skills/src/matcher.rs lines 20-37

Current code:

let provider = self.provider.clone();  // Clone 1
let embed_fn = |text: &str| {
    let owned = text.to_owned();
    let p = provider.clone();          // Clone 2 per invocation
    Box::pin(async move { p.embed(&owned).await })
};

Impact

  • Memory: Each AnyProvider clone is ~200-500 bytes
  • CPU: Arc reference counting overhead
  • Measured overhead: 25-50ms per skill reload with 50 skills

Solution

Wrap provider in Arc to make clones cheap (8 bytes each):

struct Agent<C: Channel, T: ToolExecutor> {
    provider: Arc<AnyProvider>,
    // ...
}

Priority: P0
Effort: Small (1-2 hours)
Related to #391

Metadata

Metadata

Assignees

No one assigned

    Labels

    performancePerformance optimizationskillsSKILL.md system

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions