bun - bun-v0.1.9


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 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:
- ptr() function in bun: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:
- 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

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: https://github.com/oven-sh/bun/compare/bun-v0.1.8...bun-v0.1.9


Details

date
Aug. 18, 2022, 8:49 a.m.
name
Bun v0.1.9
type
Patch
👇
Register or login to:
  • 🔍View and search all bun releases.
  • 🛠️Create and share lists to track your tools.
  • 🚨Setup notifications for major, security, feature or patch updates.
  • 🚀Much more coming soon!
Continue with GitHub
Continue with Google
or