To upgrade:
bun upgrade
To install:
curl https://bun.sh/install | bash
If you have any problems upgrading
Run the install script (you can run it multiple times):
curl https://bun.sh/install | bash
What's new
- Numerous crashes fixed by @zhuzilin!! Incredible work.
- [Linux] Improved event loop reliability and reduced CPU usage for concurrent/async IO (affects
bun install
andfetch()
mostly) Bun.serve
gets about 20% faster outside of "hello world" benchmarks due to optimizing howHeaders
are 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
setTimeout
orsetInterval
to 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:ffi
TextEncoder.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:
- oven-sh/WebKit@d2ef2fd
- oven-sh/WebKit@3262da8
- oven-sh/WebKit@4ac5b04#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
->IntPrimitive
by @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
Full Changelog: bun-v0.1.8...bun-v0.1.9