Manages benchmark documentation across multiple platforms. Use when updating benchmark results, adding performance data, or documenting jq comparison benchmarks. Triggers on terms like "benchmark", "performance", "jq comparison", "benchmark results", "update benchmarks".
This skill ensures proper handling of benchmark documentation across multiple platforms (ARM/Apple Silicon and x86_64/Intel/AMD).
For comprehensive benchmarking instructions, see docs/guides/benchmarking.md.
This skill focuses on documentation-specific rules and multi-platform considerations.
Full method and evidence: docs/guides/benchmarking.md § A/B Benchmarking Method. These seven rules each cost a wrong conclusion on #106 — the naive method reported a 16x win as a regression.
dev bench yq's defaults. Use --sizes 1mb,10mb.jq/yq. A faster binary that changed behaviour is not a win.ps -Ao pcpu, check for
cargo|rustc|claude, and require AC power.Always name the platform in the results. Every perf table in this repo names the chip; a table without one is unreviewable. Benchmark on the boxes in Platforms and Hardware, not a laptop on battery.
NEVER replace platform-specific benchmarks with each other.
When adding new benchmark data:
jq-comparison-m1.jsonl, jq-comparison-zen4.jsonlFor complete inventory, see docs/benchmarks/inventory.md.
Key locations:
data/bench/generated/ - Input files (git-ignored)data/bench/results/ - Output (git-ignored)docs/benchmarks/*.md - Documentation (tracked)README.md - Summary (tracked)For complete documentation update workflow, see docs/guides/benchmarking.md.
cargo build --release --features bench-runner./target/release/succinctly bench run jq_benchdata/bench/results/<timestamp>/jq-bench.mddocs/benchmarks/jq.md - Full results with all patterns/sizesREADME.md - Summary highlights onlyEvery benchmark table in README.md must have data for BOTH platforms:
If a table only shows one platform, add the missing platform's data from docs/benchmarks/jq.md.
Never abbreviate pattern names in tables. Use full names:
pathological not patholog.comprehensive not compreh.When using bold for values in tables, ensure spaces are OUTSIDE the ** markers:
<!-- CORRECT -->
| **59.6ms** |
<!-- WRONG (won't render as bold) -->
| ** 59.6ms** |
See the markdown-tables skill for complete table formatting rules.
| Pattern | Description | |---------------|--------------------------------| | comprehensive | Mixed content (realistic) | | users | User records (nested objects) | | nested | Deep nesting (tests BP) | | arrays | Large arrays (tests iteration) | | strings | String-heavy (tests escapes) | | unicode | Unicode strings | | pathological | Worst-case | | numbers | Number-heavy documents | | literals | Mix of null, true, false | | mixed | Heterogeneous nested structures|
CRITICAL: Always compile before benchmarking:
cargo build --release --features bench-runner
See docs/guides/benchmarking.md for environment setup and troubleshooting.
Quick checks:
cargo build --release --features bench-runneruptimels data/bench/generated/For complete command reference, see docs/guides/benchmarking.md.
IMPORTANT: Always use the unified benchmark runner (succinctly bench), not dev bench.
Always build first, then run benchmarks:
# Step 1: Build the benchmark runner (required before running benchmarks)
cargo build --release --features bench-runner
# Step 2: Generate test data (if not already present)
./target/release/succinctly json generate-suite
./target/release/succinctly yaml generate-suite
# Step 3: Run benchmarks using the unified runner
./target/release/succinctly bench run jq_bench # JSON vs jq
./target/release/succinctly bench run yq_bench # YAML vs yq
./target/release/succinctly bench run jq_comparison # Criterion JSON benchmarks
./target/release/succinctly bench run yq_comparison # Criterion YAML benchmarks
./target/release/succinctly bench list
# Run all JSON benchmarks
./target/release/succinctly bench run jq_bench jq_comparison
# Run all YAML benchmarks
./target/release/succinctly bench run yq_bench yq_comparison yaml_bench
Memory is collected by default for CLI benchmarks. Use --no-memory to skip.
| Type | Memory Collected | How | Examples |
|------|------------------|-----|----------|
| CLI | Yes (default) | /usr/bin/time peak RSS | jq_bench, yq_bench, dsv_cli |
| Criterion | No | In-process timing only | jq_comparison, yaml_bench |
| CrossParser | No | In-process timing only | json_parsers, yaml_parsers |
# Memory collected by default
./target/release/succinctly bench run yq_bench
# Skip memory collection (faster)
./target/release/succinctly bench run yq_bench --no-memory
# All CLI benchmarks support --no-memory
./target/release/succinctly bench run jq_bench --no-memory
./target/release/succinctly bench run dsv_cli --no-memory
When running via succinctly bench run, CLI benchmark results are saved to the output directory:
data/bench/results/<timestamp>/
metadata.json # System info
summary.json # Run summary
jq_bench.jsonl # Raw results with peak_memory_bytes
jq_bench.md # Markdown with memory columns
yq_bench.jsonl
yq_bench.md
stdout/
jq_bench.txt # Console output
yq_bench.txt
The yq benchmark supports multiple query types to exercise different execution paths:
| Query Type | Example | Execution Path | Description |
|----------------|------------|----------------|-------------------------------------------------|
| identity | . | P9 streaming | Full document streaming output |
| first_element| .[0] | M2 streaming | Navigate to first array element |
| iteration | .[] | M2 streaming | Iterate over array elements |
| length | length | OwnedValue | Produces computed value (not cursor-streamable) |
Always build first: cargo build --release --features bench-runner
# Run yq CLI benchmark (memory is collected by default)
./target/release/succinctly bench run yq_bench
# Run specific query types
./target/release/succinctly bench run yq_bench --queries identity
./target/release/succinctly bench run yq_bench --queries identity,first_element
# Focus on M2 streaming with the navigation pattern
./target/release/succinctly bench run yq_bench --patterns navigation --sizes 10mb,100mb
# Skip memory collection (faster, but no memory comparison)
./target/release/succinctly bench run yq_bench --no-memory
Multiple aliases are accepted for each query type:
| Query Type | Aliases |
|----------------|----------------------------------|
| identity | identity, . |
| first_element| first_element, first, .[0] |
| iteration | iteration, iter, .[] |
| length | length |
For complete instructions, see docs/guides/benchmarking.md.
Quick steps:
cargo run --release --features cli -- json generate-suitecd bench-compare && cargo bench --bench json_parsersThe bench-compare/ subproject benchmarks succinctly against other Rust JSON parsers.
| Use Case | Best Choice | Why | |-----------------------------------|------------------|------------------------------------------| | Full document traversal | sonic-rs | Fastest parse + traverse (400+ MiB/s) | | Selective field access (jq-style) | succinctly | Lazy evaluation skips unused data | | Memory-constrained environments | succinctly | 17-45x less memory than DOM parsers | | Standard DOM parsing | serde_json | Best ecosystem compatibility | | SIMD-accelerated DOM | simd-json | Fast parsing, moderate memory |
jq because unused data isn't parsed| Parser | Parse Only | Parse+Traverse | Memory (100MB) | |-------------|------------|----------------|----------------| | sonic-rs | 687 MiB/s | 425 MiB/s | 955 MB (11.9x) | | succinctly | 534 MiB/s | 283 MiB/s | 37 MB (0.46x) | | simd-json | 182 MiB/s | 227 MiB/s | 1654 MB (20.7x)| | serde_json | 153 MiB/s | 139 MiB/s | 655 MB (8.2x) |
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer