Synchronous vs asynchronous execution in Javascript - Performance Comparison
We want to see how the order of running code affects how long it takes. This helps us understand how tasks that wait or run later change the work done.
How does running code one after another compare to running some parts later?
Analyze the time complexity of the following code snippet.
function syncTask(n) {
for (let i = 0; i < n; i++) {
console.log(i);
}
}
function asyncTask(n) {
setTimeout(() => {
for (let i = 0; i < n; i++) {
console.log(i);
}
}, 0);
}
This code shows a loop running immediately (synchronous) and the same loop running after a short delay (asynchronous).
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop that runs from 0 to n-1.
- How many times: Exactly n times in both synchronous and asynchronous versions.
As n grows, the number of times the loop runs grows the same way whether synchronous or asynchronous.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 loop steps |
| 100 | 100 loop steps |
| 1000 | 1000 loop steps |
Pattern observation: The work inside the loop grows directly with n, no matter when it runs.
Time Complexity: O(n)
This means the time to finish the loop grows in a straight line with the size of n, whether the code runs now or later.
[X] Wrong: "Asynchronous code always runs faster because it runs later."
[OK] Correct: The total work inside the loop is the same; asynchronous just delays when it runs, not how much work it does.
Understanding how synchronous and asynchronous code affects timing helps you explain how programs handle tasks and wait times. This skill shows you know how code flow impacts performance.
"What if we changed the asynchronous delay from 0 to 1000 milliseconds? How would the time complexity change?"
Practice
Solution
Step 1: Understand synchronous execution
Synchronous means tasks happen one by one, each waiting for the previous to finish.Step 2: Match description to options
Tasks run one after another, waiting for each to finish before starting the next. clearly states tasks run one after another, which matches synchronous behavior.Final Answer:
Tasks run one after another, waiting for each to finish before starting the next. -> Option DQuick Check:
Synchronous = sequential task execution [OK]
- Confusing synchronous with asynchronous execution
- Thinking tasks run at the same time in synchronous
- Believing synchronous tasks run randomly
Solution
Step 1: Recall async function syntax
In JavaScript, the keyword 'async' comes before the function keyword to declare an asynchronous function.Step 2: Check each option
async function myFunction() {} uses 'async function myFunction() {}' which is correct syntax.Final Answer:
async function myFunction() {} -> Option BQuick Check:
Async keyword before function = correct syntax [OK]
- Placing async after function name
- Putting async inside parentheses
- Using invalid order of keywords
console.log('Start');
setTimeout(() => console.log('Middle'), 0);
console.log('End');Solution
Step 1: Understand synchronous and asynchronous parts
'console.log("Start")' runs immediately (synchronous). 'setTimeout' schedules 'Middle' to run later (asynchronous). 'console.log("End")' runs immediately after 'Start'.Step 2: Determine order of output
Output order is 'Start', then 'End', then 'Middle' because 'setTimeout' callback runs after current code finishes.Final Answer:
Start End Middle -> Option AQuick Check:
setTimeout delays callback, so logs after synchronous code [OK]
- Assuming setTimeout runs immediately
- Thinking output order matches code order exactly
- Ignoring asynchronous delay even if zero
function fetchData() {
let data;
fetch('https://api.example.com/data')
.then(response => response.json())
.then(json => data = json);
return data;
}
console.log(fetchData());Solution
Step 1: Analyze asynchronous fetch behavior
fetch returns a promise and .then callbacks run later, but fetchData returns immediately before data is set.Step 2: Understand return value timing
Since data is assigned asynchronously, fetchData returns undefined because data is not ready yet.Final Answer:
fetchData returns before data is assigned, so returns undefined -> Option CQuick Check:
Async assignment happens after return, so undefined returned [OK]
- Thinking fetchData waits for fetch to finish
- Assuming data is ready immediately
- Confusing syntax errors with logic errors
Solution
Step 1: Understand task dependencies
Task B depends on A finishing, so B must wait for A. Task C can run anytime, so it can run in parallel.Step 2: Choose asynchronous approach respecting dependencies
Run A asynchronously, then run B in A's callback, and run C asynchronously at the same time as A. runs A asynchronously, then runs B in A's callback (after A finishes), and runs C asynchronously at the same time as A, maximizing efficiency.Final Answer:
Run A asynchronously, then run B in A's callback, and run C asynchronously at the same time as A. -> Option AQuick Check:
Respect dependencies and run independent tasks in parallel [OK]
- Running dependent tasks in parallel ignoring order
- Running all tasks synchronously wasting time
- Running independent tasks sequentially unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
