git-subtree-dir: vendor/ruvector git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
473 lines
12 KiB
Markdown
473 lines
12 KiB
Markdown
# Edge-Net Performance Benchmarks
|
|
|
|
## Overview
|
|
|
|
Comprehensive benchmark suite for the edge-net distributed compute network. Tests all critical operations including credit management, QDAG transactions, task processing, security operations, and network coordination.
|
|
|
|
## Quick Start
|
|
|
|
### Running All Benchmarks
|
|
|
|
```bash
|
|
# Standard benchmarks
|
|
cargo bench --features=bench
|
|
|
|
# With unstable features (for better stats)
|
|
cargo +nightly bench --features=bench
|
|
|
|
# Specific benchmark
|
|
cargo bench --features=bench bench_credit_operation
|
|
```
|
|
|
|
### Running Specific Suites
|
|
|
|
```bash
|
|
# Credit operations only
|
|
cargo bench --features=bench credit
|
|
|
|
# QDAG operations only
|
|
cargo bench --features=bench qdag
|
|
|
|
# Security operations only
|
|
cargo bench --features=bench security
|
|
|
|
# Network topology only
|
|
cargo bench --features=bench topology
|
|
```
|
|
|
|
## Benchmark Categories
|
|
|
|
### 1. Credit Operations (6 benchmarks)
|
|
|
|
Tests the CRDT-based credit ledger performance:
|
|
|
|
- **bench_credit_operation**: Adding credits (rewards)
|
|
- **bench_deduct_operation**: Spending credits (tasks)
|
|
- **bench_balance_calculation**: Computing current balance
|
|
- **bench_ledger_merge**: CRDT synchronization between nodes
|
|
|
|
**Key Metrics**:
|
|
- Target: <1µs per credit/deduct
|
|
- Target: <100ns per balance check (with optimizations)
|
|
- Target: <10ms for merging 100 transactions
|
|
|
|
### 2. QDAG Transaction Operations (3 benchmarks)
|
|
|
|
Tests the quantum-resistant DAG currency performance:
|
|
|
|
- **bench_qdag_transaction_creation**: Creating new QDAG transactions
|
|
- **bench_qdag_balance_query**: Querying account balances
|
|
- **bench_qdag_tip_selection**: Selecting tips for validation
|
|
|
|
**Key Metrics**:
|
|
- Target: <5ms per transaction (includes PoW)
|
|
- Target: <1µs per balance query
|
|
- Target: <10µs for tip selection (100 tips)
|
|
|
|
### 3. Task Queue Operations (3 benchmarks)
|
|
|
|
Tests distributed task processing performance:
|
|
|
|
- **bench_task_creation**: Creating task objects
|
|
- **bench_task_queue_operations**: Submit/claim cycle
|
|
- **bench_parallel_task_processing**: Concurrent task handling
|
|
|
|
**Key Metrics**:
|
|
- Target: <100µs per task creation
|
|
- Target: <1ms per submit/claim
|
|
- Target: 100+ tasks/second throughput
|
|
|
|
### 4. Security Operations (6 benchmarks)
|
|
|
|
Tests adaptive security and Q-learning performance:
|
|
|
|
- **bench_qlearning_decision**: Q-learning action selection
|
|
- **bench_qlearning_update**: Q-table updates
|
|
- **bench_attack_pattern_matching**: Pattern similarity detection
|
|
- **bench_threshold_updates**: Adaptive threshold adjustment
|
|
- **bench_rate_limiter**: Rate limiting checks
|
|
- **bench_reputation_update**: Reputation score updates
|
|
|
|
**Key Metrics**:
|
|
- Target: <1µs per Q-learning decision
|
|
- Target: <5µs per attack detection
|
|
- Target: <100ns per rate limit check
|
|
|
|
### 5. Network Topology Operations (4 benchmarks)
|
|
|
|
Tests network organization and peer selection:
|
|
|
|
- **bench_node_registration_1k**: Registering 1,000 nodes
|
|
- **bench_node_registration_10k**: Registering 10,000 nodes
|
|
- **bench_optimal_peer_selection**: Finding best peers
|
|
- **bench_cluster_assignment**: Capability-based clustering
|
|
|
|
**Key Metrics**:
|
|
- Target: <50ms for 1K node registration
|
|
- Target: <500ms for 10K node registration
|
|
- Target: <10µs per peer selection
|
|
|
|
### 6. Economic Engine Operations (3 benchmarks)
|
|
|
|
Tests reward distribution and sustainability:
|
|
|
|
- **bench_reward_distribution**: Processing task rewards
|
|
- **bench_epoch_processing**: Economic epoch transitions
|
|
- **bench_sustainability_check**: Network health verification
|
|
|
|
**Key Metrics**:
|
|
- Target: <5µs per reward distribution
|
|
- Target: <100µs per epoch processing
|
|
- Target: <1µs per sustainability check
|
|
|
|
### 7. Evolution Engine Operations (3 benchmarks)
|
|
|
|
Tests network evolution and optimization:
|
|
|
|
- **bench_performance_recording**: Recording node metrics
|
|
- **bench_replication_check**: Checking if nodes should replicate
|
|
- **bench_evolution_step**: Evolution generation advancement
|
|
|
|
**Key Metrics**:
|
|
- Target: <1µs per performance record
|
|
- Target: <100ns per replication check
|
|
- Target: <10µs per evolution step
|
|
|
|
### 8. Optimization Engine Operations (2 benchmarks)
|
|
|
|
Tests intelligent task routing:
|
|
|
|
- **bench_routing_record**: Recording routing outcomes
|
|
- **bench_optimal_node_selection**: Selecting best node for task
|
|
|
|
**Key Metrics**:
|
|
- Target: <5µs per routing record
|
|
- Target: <10µs per optimal node selection
|
|
|
|
### 9. Network Manager Operations (2 benchmarks)
|
|
|
|
Tests P2P peer management:
|
|
|
|
- **bench_peer_registration**: Adding new peers
|
|
- **bench_worker_selection**: Selecting workers for tasks
|
|
|
|
**Key Metrics**:
|
|
- Target: <1µs per peer registration
|
|
- Target: <20µs for selecting 5 workers from 100
|
|
|
|
### 10. End-to-End Operations (2 benchmarks)
|
|
|
|
Tests complete workflows:
|
|
|
|
- **bench_full_task_lifecycle**: Create → Submit → Claim → Complete
|
|
- **bench_network_coordination**: Multi-node coordination
|
|
|
|
**Key Metrics**:
|
|
- Target: <10ms per complete task lifecycle
|
|
- Target: <100µs for coordinating 50 nodes
|
|
|
|
## Interpreting Results
|
|
|
|
### Sample Output
|
|
|
|
```
|
|
test bench_credit_operation ... bench: 847 ns/iter (+/- 23)
|
|
test bench_balance_calculation ... bench: 12,450 ns/iter (+/- 340)
|
|
test bench_qdag_transaction_creation ... bench: 4,567,890 ns/iter (+/- 89,234)
|
|
```
|
|
|
|
### Understanding Metrics
|
|
|
|
- **ns/iter**: Nanoseconds per iteration (1ns = 0.000001ms)
|
|
- **(+/- N)**: Standard deviation (lower is more consistent)
|
|
- **Throughput**: Calculate as 1,000,000,000 / ns_per_iter ops/second
|
|
|
|
### Performance Grades
|
|
|
|
| ns/iter Range | Grade | Assessment |
|
|
|---------------|-------|------------|
|
|
| < 1,000 | A+ | Excellent - sub-microsecond |
|
|
| 1,000 - 10,000 | A | Good - low microsecond |
|
|
| 10,000 - 100,000 | B | Acceptable - tens of microseconds |
|
|
| 100,000 - 1,000,000 | C | Needs optimization - hundreds of µs |
|
|
| > 1,000,000 | D | Critical - millisecond range |
|
|
|
|
## Optimization Tracking
|
|
|
|
### Known Bottlenecks (Pre-Optimization)
|
|
|
|
1. **balance_calculation**: ~12µs (1000 transactions)
|
|
- **Issue**: O(n) iteration over all transactions
|
|
- **Fix**: Cached balance field
|
|
- **Target**: <100ns
|
|
|
|
2. **attack_pattern_matching**: ~500µs (100 patterns)
|
|
- **Issue**: Linear scan through patterns
|
|
- **Fix**: KD-Tree spatial index
|
|
- **Target**: <5µs
|
|
|
|
3. **optimal_node_selection**: ~1ms (1000 history items)
|
|
- **Issue**: Filter + aggregate on every call
|
|
- **Fix**: Pre-aggregated routing stats
|
|
- **Target**: <10µs
|
|
|
|
### Optimization Roadmap
|
|
|
|
See [performance-analysis.md](./performance-analysis.md) for detailed breakdown.
|
|
|
|
## Continuous Benchmarking
|
|
|
|
### CI/CD Integration
|
|
|
|
```yaml
|
|
# .github/workflows/benchmarks.yml
|
|
name: Performance Benchmarks
|
|
|
|
on:
|
|
push:
|
|
branches: [main, develop]
|
|
pull_request:
|
|
|
|
jobs:
|
|
benchmark:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: dtolnay/rust-toolchain@nightly
|
|
- name: Run benchmarks
|
|
run: cargo +nightly bench --features=bench
|
|
- name: Compare to baseline
|
|
run: cargo benchcmp baseline.txt current.txt
|
|
```
|
|
|
|
### Local Baseline Tracking
|
|
|
|
```bash
|
|
# Save baseline
|
|
cargo bench --features=bench > baseline.txt
|
|
|
|
# After optimizations
|
|
cargo bench --features=bench > optimized.txt
|
|
|
|
# Compare
|
|
cargo install cargo-benchcmp
|
|
cargo benchcmp baseline.txt optimized.txt
|
|
```
|
|
|
|
## Profiling
|
|
|
|
### CPU Profiling
|
|
|
|
```bash
|
|
# Using cargo-flamegraph
|
|
cargo install flamegraph
|
|
cargo flamegraph --bench benchmarks --features=bench
|
|
|
|
# Using perf (Linux)
|
|
perf record --call-graph dwarf cargo bench --features=bench
|
|
perf report
|
|
```
|
|
|
|
### Memory Profiling
|
|
|
|
```bash
|
|
# Using valgrind/massif
|
|
valgrind --tool=massif target/release/deps/edge_net_benchmarks
|
|
ms_print massif.out.* > memory-profile.txt
|
|
|
|
# Using heaptrack
|
|
heaptrack target/release/deps/edge_net_benchmarks
|
|
heaptrack_gui heaptrack.edge_net_benchmarks.*
|
|
```
|
|
|
|
### WASM Profiling
|
|
|
|
```bash
|
|
# Build WASM with profiling
|
|
wasm-pack build --profiling
|
|
|
|
# Profile in browser
|
|
# 1. Load WASM module
|
|
# 2. Open Chrome DevTools > Performance
|
|
# 3. Record while running operations
|
|
# 4. Analyze flame graph
|
|
```
|
|
|
|
## Load Testing
|
|
|
|
### Stress Test Scenarios
|
|
|
|
```rust
|
|
#[test]
|
|
fn stress_test_10k_transactions() {
|
|
let mut ledger = WasmCreditLedger::new("stress-node".to_string()).unwrap();
|
|
|
|
let start = Instant::now();
|
|
for i in 0..10_000 {
|
|
ledger.credit(100, &format!("task-{}", i)).unwrap();
|
|
}
|
|
let duration = start.elapsed();
|
|
|
|
println!("10K transactions: {:?}", duration);
|
|
println!("Throughput: {:.0} tx/sec", 10_000.0 / duration.as_secs_f64());
|
|
|
|
assert!(duration < Duration::from_secs(1)); // <1s for 10K transactions
|
|
}
|
|
```
|
|
|
|
### Concurrency Testing
|
|
|
|
```rust
|
|
#[test]
|
|
fn concurrent_task_processing() {
|
|
use tokio::runtime::Runtime;
|
|
|
|
let rt = Runtime::new().unwrap();
|
|
let start = Instant::now();
|
|
|
|
rt.block_on(async {
|
|
let mut handles = vec![];
|
|
|
|
for _ in 0..100 {
|
|
handles.push(tokio::spawn(async {
|
|
// Simulate task processing
|
|
for _ in 0..100 {
|
|
// Process task
|
|
}
|
|
}));
|
|
}
|
|
|
|
futures::future::join_all(handles).await;
|
|
});
|
|
|
|
let duration = start.elapsed();
|
|
println!("100 concurrent workers, 100 tasks each: {:?}", duration);
|
|
}
|
|
```
|
|
|
|
## Benchmark Development
|
|
|
|
### Adding New Benchmarks
|
|
|
|
```rust
|
|
#[bench]
|
|
fn bench_new_operation(b: &mut Bencher) {
|
|
// Setup
|
|
let mut state = setup_test_state();
|
|
|
|
// Benchmark
|
|
b.iter(|| {
|
|
// Operation to benchmark
|
|
state.perform_operation();
|
|
});
|
|
|
|
// Optional: teardown
|
|
drop(state);
|
|
}
|
|
```
|
|
|
|
### Best Practices
|
|
|
|
1. **Minimize setup**: Do setup outside `b.iter()`
|
|
2. **Use `test::black_box()`**: Prevent compiler optimizations
|
|
3. **Consistent state**: Reset state between iterations if needed
|
|
4. **Realistic data**: Use production-like data sizes
|
|
5. **Multiple scales**: Test with 10, 100, 1K, 10K items
|
|
|
|
### Example with black_box
|
|
|
|
```rust
|
|
#[bench]
|
|
fn bench_with_black_box(b: &mut Bencher) {
|
|
let input = vec![1, 2, 3, 4, 5];
|
|
|
|
b.iter(|| {
|
|
let result = expensive_computation(test::black_box(&input));
|
|
test::black_box(result) // Prevent optimization of result
|
|
});
|
|
}
|
|
```
|
|
|
|
## Performance Targets by Scale
|
|
|
|
### Small Network (< 100 nodes)
|
|
|
|
- Task throughput: 1,000 tasks/sec
|
|
- Balance queries: 100,000 ops/sec
|
|
- Attack detection: 10,000 requests/sec
|
|
|
|
### Medium Network (100 - 10K nodes)
|
|
|
|
- Task throughput: 10,000 tasks/sec
|
|
- Balance queries: 50,000 ops/sec (with caching)
|
|
- Peer selection: 1,000 selections/sec
|
|
|
|
### Large Network (> 10K nodes)
|
|
|
|
- Task throughput: 100,000 tasks/sec
|
|
- Balance queries: 10,000 ops/sec (distributed)
|
|
- Network coordination: 500 ops/sec
|
|
|
|
## Troubleshooting
|
|
|
|
### Benchmarks Won't Compile
|
|
|
|
```bash
|
|
# Ensure nightly toolchain
|
|
rustup install nightly
|
|
rustup default nightly
|
|
|
|
# Update dependencies
|
|
cargo update
|
|
|
|
# Clean build
|
|
cargo clean
|
|
cargo bench --features=bench
|
|
```
|
|
|
|
### Inconsistent Results
|
|
|
|
```bash
|
|
# Increase iteration count
|
|
BENCHER_ITERS=10000 cargo bench --features=bench
|
|
|
|
# Disable CPU frequency scaling (Linux)
|
|
sudo cpupower frequency-set --governor performance
|
|
|
|
# Close background applications
|
|
# Run multiple times and average
|
|
```
|
|
|
|
### Memory Issues
|
|
|
|
```bash
|
|
# Increase stack size
|
|
RUST_MIN_STACK=16777216 cargo bench --features=bench
|
|
|
|
# Reduce test data size
|
|
# Check for memory leaks with valgrind
|
|
```
|
|
|
|
## References
|
|
|
|
- [Rust Performance Book](https://nnethercote.github.io/perf-book/)
|
|
- [Criterion.rs](https://github.com/bheisler/criterion.rs) (alternative framework)
|
|
- [cargo-bench documentation](https://doc.rust-lang.org/cargo/commands/cargo-bench.html)
|
|
- [Performance Analysis Document](./performance-analysis.md)
|
|
|
|
## Contributing
|
|
|
|
When adding features, include benchmarks:
|
|
|
|
1. Add benchmark in `src/bench.rs`
|
|
2. Document expected performance in this README
|
|
3. Run baseline before optimization
|
|
4. Run after optimization and document improvement
|
|
5. Add to CI/CD pipeline
|
|
|
|
---
|
|
|
|
**Last Updated**: 2025-01-01
|
|
**Benchmark Count**: 40+
|
|
**Coverage**: All critical operations
|