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.
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:
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:
The second request does not start until the first one finishes.
If the tasks are independent, start them together:
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:
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
awaitstatements for work that could run concurrently. - Assuming
awaitblocks the whole JavaScript thread like synchronous code. - Forgetting
Promise.allwhen multiple independent operations should start together. - Optimizing syntax choice before measuring the real bottleneck.
Summary
- '
async/awaitis generally not meaningfully slower than promises in real applications.' - '
asyncfunctions 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.allwithawaitwhen independent operations should run in parallel. - Prefer the style that makes the asynchronous logic easiest to read correctly.
Related reading
- Is binary search optimal in worst case?
- Is complexity Ologn equivalent to Osqrtn?
- Is CPU to GPU data transfer slow in TensorFlow?
- Is DateTime.Now the best way to measure a function's performance?
- Is asynchronous jdbc call possible?
- Is asynchronous jdbc call possible?
- Is DOM manipulation asynchronous when using the API provided by the browsers like getElementById or appendChild?
- Is it a bad idea to use indexOf inside loops?

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 courseTrack 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.