mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 10:28:47 +00:00
## Summary Move `Buffer.slice()` / `Buffer.subarray()` from a JS builtin to a native C++ implementation, eliminating the `adjustOffset` closure allocation and JS→C++ constructor overhead on every call. Additionally, add an int32 fast path that skips `toNumber()` (which can invoke `valueOf`/`Symbol.toPrimitive`) when arguments are already int32—the common case for calls like `buf.slice(0, 10)`. ## Changes - **`src/bun.js/bindings/JSBuffer.cpp`**: Add `jsBufferPrototypeFunction_sliceBody` with `adjustSliceOffsetInt32` / `adjustSliceOffsetDouble` helpers. Update prototype hash table entries from `BuiltinGeneratorType` to `NativeFunctionType` for both `slice` and `subarray`. - **`src/js/builtins/JSBufferPrototype.ts`**: Remove the JS `slice` function (was lines 667–687). - **`bench/snippets/buffer-slice.mjs`**: Add mitata benchmark. ## Benchmark (Apple M4 Max) | Benchmark | Before (v1.3.8) | After | Speedup | |---|---|---|---| | `Buffer(64).slice()` | 27.19 ns | **14.56 ns** | **1.87x** | | `Buffer(1024).slice()` | 27.84 ns | **14.62 ns** | **1.90x** | | `Buffer(1M).slice()` | 29.20 ns | **14.89 ns** | **1.96x** | | `Buffer(64).slice(10)` | 30.26 ns | **16.01 ns** | **1.89x** | | `Buffer(1024).slice(10, 100)` | 30.92 ns | **18.32 ns** | **1.69x** | | `Buffer(1024).slice(-100, -10)` | 28.82 ns | **17.37 ns** | **1.66x** | | `Buffer(1024).subarray(10, 100)` | 28.67 ns | **16.32 ns** | **1.76x** | **~1.7–1.9x faster** across all cases. All 449 buffer tests pass. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
124 KiB
124 KiB