Bun

Bun v0.1.9


Jarred Sumner · August 18, 2022

To upgrade:

bun upgrade

To install:

curl https://bun.sh/install | bash

If you have any problems upgrading

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 and fetch() mostly)
  • Bun.serve gets about 20% faster outside of "hello world" benchmarks due to optimizing how Headers are copied/read and faster generated bindings
  • require("buffer") and require("process") now point to Bun's implementation instead of a browserify polyfill (thanks @zhuzilin)
  • Fixed a bug that would cause setTimeout or setInterval to not keep the process alive (thanks @zhuzilin)
  • Updated to latest WebKit
  • 6x - 10x faster ptr() in bun:ffi

JIT-optimized TextEncoder.encodeInto can be a 1.5x perf boost up to around a 5x perf boost

image

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

image

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:

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:

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

image

What's Changed

  • fix MD5 length and compile error by @zhuzilin in https://github.com/oven-sh/bun/pull/1050
  • fix appendFile permission by @zhuzilin in https://github.com/oven-sh/bun/pull/1052
  • Invalidate column name caches when the schema of table may change by @zhuzilin in https://github.com/oven-sh/bun/pull/1056
  • refactor(src/tagged_pointer): IntPrimtiive -> IntPrimitive by @ryanrussell in https://github.com/oven-sh/bun/pull/1046
  • Remove column name caches in js by @zhuzilin in https://github.com/oven-sh/bun/pull/1057
  • [bun error] fix typo in markdown.ts by @eltociear in https://github.com/oven-sh/bun/pull/995
  • [WIP] Native buffer module by @zhuzilin in https://github.com/oven-sh/bun/pull/1067
  • Improve event loop reliability on Linux by @Jarred-Sumner in https://github.com/oven-sh/bun/pull/1066
  • Add synthetic buffer module by @zhuzilin in https://github.com/oven-sh/bun/pull/1076
  • Deps - Update libarchive by @jonacollazo in https://github.com/oven-sh/bun/pull/1078
  • Fix active_task count for timeout tasks by @zhuzilin in https://github.com/oven-sh/bun/pull/1081
  • Fix server segfault by making controller not early GC'ed by @zhuzilin in https://github.com/oven-sh/bun/pull/1090
  • Add native process module by @zhuzilin in https://github.com/oven-sh/bun/pull/1095

New Contributors

  • @jonacollazo made their first contribution in https://github.com/oven-sh/bun/pull/1078

Full Changelog