benchmark formatting

This commit is contained in:
Stephen Grider 2025-06-20 16:37:27 -06:00
parent 0643d25ca3
commit 92451c32bc
3 changed files with 27 additions and 13 deletions

View file

@ -5,12 +5,15 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## Commands ## Commands
**Testing:** **Testing:**
- `npm test` - Run all tests (linting, unit tests, coverage, TypeScript definitions) - `npm test` - Run all tests (linting, unit tests, coverage, TypeScript definitions)
- `npx ava test/<specific-test-file>.js` - Run a specific test file - `npx ava test/<specific-test-file>.js` - Run a specific test file
- `npx xo` - Run linting only
- `npx tsd` - Run TypeScript definition tests only - `npx tsd` - Run TypeScript definition tests only
NO LINTING. DONT ATTEMPT OT LINT
**Benchmarking:** **Benchmarking:**
- `npm run bench` - Run performance benchmarks - `npm run bench` - Run performance benchmarks
## Architecture ## Architecture
@ -18,16 +21,19 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
Chalk is a zero-dependency terminal string styling library built as a pure ESM module. Key architectural elements: Chalk is a zero-dependency terminal string styling library built as a pure ESM module. Key architectural elements:
1. **Core Files:** 1. **Core Files:**
- `source/index.js` - Main entry point with the chalk factory and chainable API implementation - `source/index.js` - Main entry point with the chalk factory and chainable API implementation
- `source/utilities.js` - Helper functions for string manipulation and color conversion - `source/utilities.js` - Helper functions for string manipulation and color conversion
- `source/vendor/` - Vendored dependencies (ansi-styles and supports-color) to avoid external dependencies - `source/vendor/` - Vendored dependencies (ansi-styles and supports-color) to avoid external dependencies
2. **Internal Symbols:** 2. **Internal Symbols:**
- `GENERATOR` - Manages chalk instance creation and configuration - `GENERATOR` - Manages chalk instance creation and configuration
- `STYLER` - Handles style application and chaining - `STYLER` - Handles style application and chaining
- `IS_EMPTY` - Tracks empty string optimization - `IS_EMPTY` - Tracks empty string optimization
3. **API Design:** 3. **API Design:**
- Uses ES6 Proxy for dynamic property access (e.g., `chalk.red.bold`) - Uses ES6 Proxy for dynamic property access (e.g., `chalk.red.bold`)
- Chainable API with lazy property definition for performance - Chainable API with lazy property definition for performance
- Supports nested styles with proper ANSI escape code management - Supports nested styles with proper ANSI escape code management
@ -45,4 +51,4 @@ Chalk is a zero-dependency terminal string styling library built as a pure ESM m
- All style properties are dynamically generated via Proxy - there's no hardcoded list - All style properties are dynamically generated via Proxy - there's no hardcoded list
- Performance is critical - run benchmarks before/after changes to core functionality - Performance is critical - run benchmarks before/after changes to core functionality
- The codebase uses symbols for private properties to prevent collisions - The codebase uses symbols for private properties to prevent collisions
- Template literal processing has special handling for newlines and empty strings - Template literal processing has special handling for newlines and empty strings

View file

@ -1,7 +1,7 @@
import { Bench } from "tinybench"; import { Bench } from "tinybench";
import chalk from "./source/index.js"; import chalk from "./source/index.js";
const bench = new Bench({ time: 150 }); const bench = new Bench({ time: 1 });
const chalkRed = chalk.red; const chalkRed = chalk.red;
const chalkBgRed = chalk.bgRed; const chalkBgRed = chalk.bgRed;
@ -50,15 +50,23 @@ bench
await bench.run(); await bench.run();
// Custom table output without samples, latency med, or throughput med // Format throughput values with comma separators
const customTable = bench.tasks.map((task) => ({ const formatThroughput = (value) => {
return Math.round(value).toLocaleString();
};
// Format time values in nanoseconds (converting from ms)
const formatTime = (milliseconds) => {
const nanoseconds = milliseconds * 1e6;
return Math.round(nanoseconds).toLocaleString() + " ns";
};
// Create custom table with throughput and time columns
const table = bench.tasks.map((task) => ({
"Task name": task.name, "Task name": task.name,
// 'Latency avg (ns)': task.result.latency.mean.toFixed(2) + ' ± ' + task.result.latency.rme.toFixed(2) + '%', "Throughput avg (ops/s)": formatThroughput(task.result.throughput.mean),
"Throughput avg (ops/s)": "Throughput med (ops/s)": formatThroughput(task.result.throughput.p50),
task.result.throughput.mean.toFixed(0) + "Avg time per op": formatTime(task.result.latency.mean),
" ± " +
task.result.throughput.rme.toFixed(2) +
"%",
})); }));
console.table(customTable); console.table(table);

View file

@ -22,7 +22,7 @@
}, },
"scripts": { "scripts": {
"test": "c8 ava && tsd", "test": "c8 ava && tsd",
"bench": "matcha benchmark.js" "bench": "node benchmark.js"
}, },
"files": [ "files": [
"source", "source",