To upgrade:
bun upgradeTo install:
curl https://bun.sh/install | bashIf you have any problems upgrading
Run the install script (you can run it multiple times):
curl https://bun.sh/install | bashWhat's new
- Numerous crashes fixed by @zhuzilin!! Incredible work.
- [Linux] Improved event loop reliability and reduced CPU usage for concurrent/async IO (affects
bun installandfetch()mostly) Bun.servegets about 20% faster outside of "hello world" benchmarks due to optimizing howHeadersare copied/read and faster generated bindingsrequire("buffer")andrequire("process")now point to Bun's implementation instead of a browserify polyfill (thanks @zhuzilin)- Fixed a bug that would cause
setTimeoutorsetIntervalto not keep the process alive (thanks @zhuzilin) - Updated to latest WebKit
- 6x - 10x faster
ptr()inbun:ffi
JIT-optimized TextEncoder.encodeInto can be a 1.5x perf boost up to around a 5x perf boost

The hash() function in this microbenchmark calls ptr():

Internals
Bun learns how to JIT
DOMJIT is a JavaScriptCore API that gives 3rd-party embedders low-level access to the JIT compiler/assembler to optimize native functions and getters/setters. Safari leverages DOMJIT to make commonly-accessed properties like element.parentNode faster
Bun is beginning to use DOMJIT now, starting in two places:
ptr()function inbun:ffiTextEncoder.encodeInto
To better support Bun's usecase, I extended DOMJIT to support Typed Array arguments, as well as added support for specifying more kinds of side effects that enable/disable optimizations:
- https://github.com/oven-sh/WebKit/commit/d2ef2fd828761778a3b04289563946354a457e29
- https://github.com/oven-sh/WebKit/commit/3262da8fd77667aaf95e75c7efa501dc135bc0ac
- https://github.com/oven-sh/WebKit/commit/4ac5b04047a53ce2363495a79770a2ae6d67761b#diff-90a5d15b3faae39b6e5075902ae5fd2e0b7f7f40bb0590f3e298e7715db048e5
Faster and more reliable JSC <> Zig bindings
At Bun's compile-time, Bun now code-generates C++ binding classes for JavaScript objects implemented in Zig. Previously, Bun mostly used the JavaScriptCore C API.
Using JavaScriptCore's C++ API improves performance and is important for making the garbage collector better aware of Bun's usage. But, writing bindings manually can be very repetitive.
Given a class definition in JavaScript like this:
define({
name: "Response",
construct: true,
finalize: true,
JSType: "0b11101110",
klass: {
json: {
fn: "constructJSON",
},
// rest of the code
},
proto: {
url: {
getter: "getURL",
cache: true,
},
text: { fn: "getText" },
json: { fn: "getJSON" },
arrayBuffer: { fn: "getArrayBuffer" },
blob: { fn: "getBlob" },
clone: { fn: "doClone", length: 1 },
// rest of the code
},
});Bun generates corresponding:
- C++ classes
- Zig bindings with type checks that verify the expected ABI matches
This approach is inspired by WebIDL bindings which both Safari and Chromium use.
More reliable event loop on Linux
This screenshot is with a simulated bandwidth limit and no throttling of max http connections
Previously, bun had a tendency to hang in situations like this
What's Changed
- fix MD5 length and compile error by @zhuzilin in
#1050 - fix appendFile permission by @zhuzilin in
#1052 - Invalidate column name caches when the schema of table may change by @zhuzilin in
#1056 - refactor(src/tagged_pointer):
IntPrimtiive->IntPrimitiveby @ryanrussell in#1046 - Remove column name caches in js by @zhuzilin in
#1057 - [bun error] fix typo in markdown.ts by @eltociear in
#995 - [WIP] Native buffer module by @zhuzilin in
#1067 - Improve event loop reliability on Linux by @Jarred-Sumner in
#1066 - Add synthetic buffer module by @zhuzilin in
#1076 - Deps - Update libarchive by @jonacollazo in
#1078 - Fix active_task count for timeout tasks by @zhuzilin in
#1081 - Fix server segfault by making controller not early GC'ed by @zhuzilin in
#1090 - Add native process module by @zhuzilin in
#1095
New Contributors
- @jonacollazo made their first contribution in
#1078
