DEV Community

Cover image for Bun vs. Node.js: Which JavaScript Runtime Is Better?
Alexey Kalachik for Fively

Posted on • Originally published at 5ly.co

Bun vs. Node.js: Which JavaScript Runtime Is Better?

In this research, Fively serverless specialist helped to figure out which JavaScript runtime is better: Node.js, as a gold standard, or recently appeared Bun.

In the dynamic realm of web development, JavaScript runtimes have consistently played a pivotal role. Over the years, we've seen a few key players dominate the landscape, with Node.js setting the gold standard for performance, versatility, and community support. However, as with any technology, innovation doesn't sleep.

On September 8, 2023, the world of JavaScript runtimes welcomed a formidable new entrant, Bun. They unveiled a stable release, complete with a comprehensive suite of tools such as an NPM-compatible package manager, bundler, and APIs, among others. Bun is not just a new name; it promises to bring a plethora of advantages primarily centered on performance and the overall developer experience.

Bun vs. Node.js: Who Is in the Lead?

With a keen focus on seamless interoperability, Bun is pitching itself as a "fresh competitor to Node.js," and is creating ripples in the community. The comparisons like "Bun vs. Node" and "Bun vs. Node.js", are becoming frequent talking points in developer circles.

But what exactly is Bun? And can it truly measure up to the might of Node.js? Let’s figure it out with our cloud solutions architect and serverless specialist Kiryl Anoshka.

Understanding Bun

First of all, let’s figure out what JavaScript runtime is - it’s a program that extends the JS engine and provides extra functionalities, so it can interact with the outside world. Also, the JS runtime provides features and APIs to build JS-based software.

And Bun’s runtime didn't just appear out of the blue. Its inception is attributed to Jarred Sumner, a web developer whose frustrations with certain complexities and performance issues in Node.js led him to conceive an alternative. Beginning as a solo endeavor in 2022, Bun has grown exponentially, capturing the attention of web developers worldwide.

Source: Bun.sh

At its core, Bun is more than just a runtime. It positions itself as a comprehensive toolkit, encapsulating a runtime similar to popular choices like Node or Deno, a package manager reminiscent of NPM or pnpm, and a build tool akin to webpack or Vite. Its unique architecture, built upon the WebKit/Safari JavaScriptCore engine (as opposed to Node's V8 engine), promises speed and efficiency.

The conscious decision to circumvent any Node or NPM dependencies further emphasizes its commitment to minimizing the JavaScript stack. This streamlined approach is a stark contrast to traditional Node.js setups and is a point of intrigue for many in the community.

Highlighting some of its most notable strengths, Bun touts performance benchmarks showcasing speeds up to 10 times faster than Node.js in select scenarios. These figures, though impressive, lead to debates and the inevitable "bun vs. node.js" comparisons. Let’s go into this topic step by step.

Bun vs Node.js: a General Overview

When diving into the world of JavaScript runtimes, it's paramount to understand the architectural and foundational differences between options. The debate between Bun and Node.js is particularly intriguing due to their contrasting designs, foundations, and overall architectures.

Design & Foundations

Node.js, a stalwart in the runtime landscape, leverages Google's V8 engine, which is famously used by Chrome and other Chromium-based browsers. It's written primarily in C++, making it both powerful and efficient for a wide range of applications.

Bun, on the other hand, adopts a novel approach, being constructed atop the WebKit/Safari JavaScriptCore engine. Rather than depending on traditional JavaScript, its libraries are crafted in C and Zig. This distinctive choice has both advantages and challenges, especially when matched against Node's tried-and-tested V8 foundation.

Engines

Engines are pivotal to runtime performance. Node's V8 is known for its fast execution, garbage collection, and efficient JIT (Just-In-Time) compilation. It's continuously refined by Google, resulting in consistent performance upgrades.

Conversely, Bun's reliance on the JavaScriptCore engine allows it to offer unique optimization opportunities. However, it's essential to note that while V8 has been battle-tested for years in myriad scenarios, Bun's engine is relatively younger in its application outside browser contexts.

Community Support & Ecosystem

No technology can thrive without a robust community and ecosystem. Node.js, given its tenure, boasts a massive community with a sprawling library ecosystem. NPM, its package manager, is one of the largest software registries globally. This expansive support means developers can easily find libraries, tools, or solutions for almost any challenge.

Bun, while promising, is still in its infancy. Its rapid growth, with over 100 contributors in a short span, is commendable, however, it's yet to achieve the vast ecosystem and community depth that Node.js offers.

Need a Project Estimation? 🎯
Let's calculate the price of your project with Fively.
Estimate a project

Bun vs. Node.js: Benchmarks Comparison

In the world of server-side JavaScript, Node.js has dominated for a long time. Recently, however, a new contender named Bun has emerged, promising better performance and developer experience. We've conducted a series of benchmarks to see how Bun stacks up against Node.js, particularly within a serverless context like AWS Lambda, where cold starts and compute performance matter immensely.

Environment Configuration

For the sake of accuracy and repeatability, we used a consistent setup for our tests. Here's a breakdown of the environment:

  • Connection Mechanism: REST API Gateway connected to Lambda Function. This setup allowed us to measure response times from the API Gateway, ensuring a comprehensive end-to-end evaluation;
  • Memory Allocation: Lambda Functions were allocated 1152 MB memory, slightly more than the conventional setting, to better gauge memory-intensive operations;
  • Architectural Compatibility: Bun was tested on the ARM64 architecture running on Amazon Linux 2, to explore its adaptability on newer processors;
  • Node.js Configuration: We utilized the base runtime setup for Node.js 18.x on an x86_64 architecture, reflecting its common usage;
  • Concurrency Setup: Maintained a provisioned concurrency of 6, except during the cold-start test, to keep a constant inflow of requests.

The Benchmarking Overview

1) General processing performance

Test: Generate and sort 100K random numbers 10 times consecutively.

Node.js: Median Response Time: 3400 ms;

Bun: Median Response Time: 1700 ms (-50%).

General processing performance of Bun vs. Node.js. Source: Fively

2) CRUD API Performance

Test: Implement a CRUD Update function involving a simple interaction with DynamoDB.

Node.js: Median Response Time: 22 ms;

Bun: Median Response Time: 23 ms (+4.5%).

CRUD API Performance of Bun vs. Node.js. Source: Fively

3) Cold Start Times

Test: Execution of a "Hello World" function with induced cold starts.

Node.js: Median Response Time: 290 ms;

Bun: Median Response Time: 750 ms (+158%).

Cold Start Times of Bun vs. Node.js. Source: Fively

4) Memory Usage

Test: Monitoring memory consumption during CRUD operations.

Node.js: Average Memory Used: 40 MB;

Bun: Average Memory Used: 70 MB (+75%).

Memory consumption during CRUD operations of Bun vs. Node.js. Source: Fively

Tests Interpretation

Let’s now see how Bun is compared to Node.js according to our tests' results:

Benchmark

Bun

Node.js

General processing performance

1700 ms

3400 ms

CRUD API Performance

23 ms

22 ms

Cold Start Times

750 ms

290 ms

Memory Usage

70 MB

40 MB

Surprisingly, despite Bun's infancy and lack of Lambda optimization, it showcased impressive CPU-bound task performance, nearly halving Node.js's compute time in our general processing test. For standard CRUD operations, Bun's performance was comparable to Node's.

However, the cold-start time, as well as memory usage was significantly higher for Bun, indicating room for improvement. According to out tests’ results, we can see that Node.js is still outperforming Bun in most of the benchmarks.

Need a Project Estimation? 🎯
Let's calculate the price of your project with Fively.
Estimate a project

Serverless: Why Node.js Wins Over Bun

The serverless paradigm has revolutionized how we perceive and develop applications. In this new frontier, the efficiency, reliability, and performance of your chosen runtime are more critical than ever. And when it comes to serverless, Node.js proves its supremacy. Let’s look in detail at how Bun is compared to Node.js in the serverless context.

The Non-Standard Runtime Issue with Bun

Being a non-standard runtime for lambda functions, Bun presents a predicament: in cold start scenarios, this runtime needs to be downloaded repeatedly. AWS, a leading provider of serverless solutions, does not currently optimize for non-standard runtimes like Bun. This lack of optimization can lead to latency issues and affect the app's overall performance. AWS has a standard solution of provisioned concurrency, which can help to solve this problem, but this is quite expensive if your app is large.

Cold Starts and AWS Optimizations

Cold starts are instances when a new instance of a function is initialized. These scenarios are notorious for longer initialization times. With Node.js, AWS has significant optimizations in place, ensuring minimal latency. However, with Bun's non-standard nature, the cold start times are exacerbated by the need to repeatedly download the runtime.

The Unmatched Efficiency of Node.js

In the realm of serverless applications, efficiency is king. While Bun showcases promise in various areas, it's hard to rival Node.js's proven track record in serverless environments. The maturity, optimization, and consistent performance of Node.js ensure that when serverless is the game, Node.js remains unmatched.

Here’s how our top Cloud solutions architect and Serverless specialist Kiryl Anoshka comments on the rise of Bun:

Kiryl Anoshka comments on the drawbacks of using Bun for serverless development

He also emphasizes the fact that there’s no need for web developers to get an additional Bun certification now, as Node.js certification is enough.

I think that now there is no need for our developers to get Bun certification, as Node.js successfully covers it all. But, of course, thighs may change in the future.

Pros and Cons of Bun

Let’s now accumulate what we’ve already said before, add the analysis of the tests’ results, and objectively evaluate Bun’s strengths and weaknesses.

Advantages of Bun

  • Performance Efficiency: Bun's potential for cost savings is evident, especially given its reduced execution time. For CPU-intensive operations, this could translate to substantial financial benefits;
  • Enhanced Development Experience: Developers working with Bun enjoy a smoother journey, with rapid package installation, native testing support, and a more intuitive interface;
  • Lightweight Footprint: Without the baggage of Node or NPM dependencies, Bun prides itself on minimizing JavaScript in its stack, which can be beneficial in specific use-case scenarios.

Drawbacks

  • Cold Start Concerns: Cold starts pose a significant challenge for Bun, impacting both the performance and cost, especially in serverless environments;
  • Battle Testing: Bun's newness in the market means it hasn't been rigorously tested in diverse, large-scale production scenarios, unlike Node.js;
  • API Compatibility Issues: Being a fresh entrant, Bun lacks full compatibility with some Node.js APIs, which might pose integration and migration challenges;
  • Serverless Impediments: As highlighted earlier, Bun's non-standard runtime nature requires repeated downloads in serverless contexts, with platforms like AWS not offering optimal and cost-efficient support.

While the horizon looks promising for Bun with its distinct advantages, the road ahead is laden with challenges it needs to overcome. As of now, it might be premature to embrace Bun for extensive production use, but its potential is undeniable, and keeping an eye on this rising star could be beneficial.

However, in the sprawling landscape of technology, professional custom software development plays a pivotal role in ensuring that software solutions remain robust, agile, and optimized. Node.js, with its proven track record, established community, and extensive battle-testing, still remains the undisputed leader for real-world complex projects.

With Node.js, there's a recognized certification path that's globally accepted, ensuring developers showcase their expertise effectively. When contrasting with newer technologies like Bun, there's still an absence of this streamlined certification pathway, which can also influence the choice of technology.

Final Word

Finalizing our research, we can say that currently Node.js still outperforms Bun in many benchmarks and points like memory usage, cold starts, AWS optimization, serverless development, and cost-efficiency. Add to that the vast community, professional development opportunities, and the absence of a need for additional certifications, Node.js establishes itself as an unbeatable contender.

At the same time, Bun, with its distinct architecture, offers promising performance benchmarks and signifies the continuous drive for innovation in the realm of JavaScript runtimes. It has the potential to improve and become a fully-fledged Node.js rival in the future.

At Fively, we pride ourselves on our profound experience in web application development, especially in harnessing the power of Node.js. As the landscape continues to evolve, our commitment to delivering excellence remains unwavering.

Thank You For Reading (Source: Giphy)

👨‍💻 If you're looking to elevate your software solutions and leverage the unmatched efficiency of Node.js, don't hesitate to contact us.

Together, we'll craft solutions that not only meet but exceed your expectations. Let’s fly! 🚀

Top comments (5)

Collapse
 
manchicken profile image
Mike Stemle

I know it can be fun to compare and contrast, but I think the neat thing about code is that if the runtime was implemented well, we should be able to evaluate them for specific use cases without much in the way of code changes.

A strong standards body for EMCAScripy (that isn’t Oracle) will help ensure that this is possible.

It’s like the old saying goes: protocols over platforms.

Collapse
 
lionelrowe profile image
lionel-rowe

WinterCG (Web-interoperable Runtimes Community Group)

This community group aims to provide a space for JavaScript runtimes to collaborate on API interoperability. We focus on documenting and improving interoperability of web platform APIs across runtimes (especially non-browser ones).

Collapse
 
kiryl_anoshka profile image
Kiryl Anoshka

Yes, that's why this evaluation is only on AWS Lambda environment.
In my local dev though it's so cool.

Collapse
 
adaptive-shield-matrix profile image
Adaptive Shield Matrix • Edited

In my benchmark/speed comparisons

  • bun has better/faster startup time
  • bun has better/faster File access (using Bun apis)
  • speed/memory consumption is about same
  • summary: from a performance perspective - no major changes

but the biggest advantages of bun are better developer experience / integration using it as a runtime

  • typescript support & executing typescript
  • test runner (with support of typescript)
  • build-in live reload server (with typescript support)
  • es modules vs common js modules (no longer spend hours/days debugging import problems)
  • summary: bun has very good dx/integration with typescript, if you are only using js then you will see no difference.
  • of course you can spend x hours/days finding and configuring many tools to work in nodejs seamlessly just like in bun, but is your time spend on configuring countless separate nodejs tools well spend / justified ? I think not
Collapse
 
kiryl_anoshka profile image
Kiryl Anoshka

Great summary! Thanks @adaptiveshieldmatrix