async/await
promises
JavaScript performance
asynchronous programming
JavaScript optimization

is async/await slower than promises?

Data Structures & Algorithms practice on Codemia

Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.

Practice algorithms

Introduction

Usually, no: async and await are not meaningfully slower than promises in the way most applications care about. async functions are built on top of promises, so the runtime cost difference is normally tiny compared with network latency, disk I/O, or rendering.

What actually changes performance is often the control flow you write around them. await can accidentally serialize work that could have run concurrently.

async and await Still Use Promises

These two functions are conceptually very close:

javascript
1function withPromises() {
2  return fetch("/api/user").then(response => response.json());
3}
4
5async function withAsyncAwait() {
6  const response = await fetch("/api/user");
7  return response.json();
8}

The async version still returns a promise. The main difference is syntax and how you express sequencing and error handling.

The Real Performance Trap Is Sequential await

This pattern is slower than it needs to be when the tasks are independent:

javascript
const a = await fetch("/api/a");
const b = await fetch("/api/b");

The second request does not start until the first one finishes.

If the tasks are independent, start them together:

javascript
1const [a, b] = await Promise.all([
2  fetch("/api/a"),
3  fetch("/api/b"),
4]);

That is usually the real source of the slowdown people blame on async/await.

Micro-Benchmarks Can Mislead You

You can build synthetic benchmarks where one style has slightly more overhead than the other, but those differences are usually microscopic compared with the actual asynchronous work.

So in a real application, the more important questions are:

  • are the tasks sequential or concurrent
  • is the bottleneck network, disk, CPU, or DOM work
  • is the code easy enough to read that concurrency mistakes are obvious

Those factors dominate the tiny wrapper cost of async functions.

Readability Is Often the Bigger Win

async and await often make control flow easier to understand:

javascript
1async function loadUser() {
2  try {
3    const response = await fetch("/api/user");
4    return await response.json();
5  } catch (error) {
6    console.error(error);
7    throw error;
8  }
9}

That readability can reduce bugs and make batching or sequencing decisions easier to review.

Promise Chains Are Still Fine

This does not mean promise chains are obsolete. They are still useful for:

  • compact one-step transformations
  • explicit batching with Promise.all
  • libraries that already expose promise combinators naturally

The important point is that async/await is a language feature over the same promise-based model, not a fundamentally different execution engine.

Another practical detail is that async functions always wrap their return value in a promise. That does add a small amount of machinery, but in most applications the overhead is far smaller than the cost of the actual asynchronous work being coordinated.

If your code is truly CPU-bound and hot enough that promise-wrapper overhead matters, the bigger question is usually why the logic is promise-heavy in the first place. JavaScript async syntax is rarely the dominant bottleneck in those cases.

For most teams, the more valuable optimization is making concurrency intent explicit and avoiding accidental serialization.

That usually matters more.

Common Pitfalls

  • Benchmarking keyword overhead while ignoring the real asynchronous cost.
  • Writing sequential await statements for work that could run concurrently.
  • Assuming await blocks the whole JavaScript thread like synchronous code.
  • Forgetting Promise.all when multiple independent operations should start together.
  • Optimizing syntax choice before measuring the real bottleneck.

Summary

  • 'async/await is generally not meaningfully slower than promises in real applications.'
  • 'async functions still return promises and run on the same event-loop model.'
  • The biggest performance difference usually comes from sequential versus concurrent control flow.
  • Use Promise.all with await when independent operations should run in parallel.
  • Prefer the style that makes the asynchronous logic easiest to read correctly.

Related reading
Course
Intermediate
27 lessons
15 hours
DSA Fundamentals

Master algorithmic patterns and data structures through hands-on LeetCode-style problems - from arrays and hashing to dynamic programming and advanced graphs.

View the course
Track what you have practised

A free account saves your progress, solutions and study plan across every problem on Codemia.

Data Structures & Algorithms practice on Codemia

Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.

Practice algorithms

All Rights Reserved.