mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 18:38:55 +00:00
## Summary Cache frequently-used HTML tag strings (div, p, h1-h6, etc.) in `GlobalObject` using `LazyProperty<JSGlobalObject, JSString>` instead of creating new JSStrings on every React element creation in `Bun.markdown.react()`. ## Changes - Added `BunMarkdownTagStrings.h/.cpp` with 30 cached tag strings - Modified `MarkdownObject.zig` to use cached strings via C API - Integrated with `ZigGlobalObject` for proper GC visiting ## Benchmark Results All benchmarks performed on Apple M4 Max with release builds. ### mitata Benchmark (Bun.markdown.react) | Size | Main | Feature | Improvement | |------|------|---------|-------------| | small (121 chars) | 3.20 µs | 2.30 µs | **28% faster** | | medium (1039 chars) | 15.09 µs | 14.02 µs | **7% faster** | | large (20780 chars) | 288.48 µs | 267.14 µs | **7.4% faster** | ### Heap Profile | Metric | Main | Feature | Improvement | |--------|------|---------|-------------| | Heap size | 500.7 KB | 469.7 KB | **6% reduction** | | Object count | 12,000 | 10,315 | **14% reduction** | | String count | 4,248 | 2,563 | **40% reduction** | | String size | 97.1 KB | 65.8 KB | **32% reduction** | ### HTTP Request Benchmark (ab -n 10000 -c 20) | Metric | Main | Feature | Improvement | |--------|------|---------|-------------| | Requests/sec | 7,710 | 8,174 | **6% faster** | | Time/request | 2.59 ms | 2.45 ms | **5% faster** | | p99 latency | 6 ms | 3 ms | **50% improvement** | ## Technical Details The optimization uses JSC's `LazyProperty` pattern (similar to `BunCommonStrings` and `BunHttp2CommonStrings`) to lazily initialize and cache tag strings on first use. This avoids repeated `bun.String.createUTF8ForJS` calls which allocate new JSStrings for the same tag names on every markdown element. --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
npm install
bun run ffi
bun run log
bun run gzip
bun run async
bun run sqlite
# to use custom version of bun/deno/node binary
BUN=path/to/bun bun run ffi
# or edit .env file