Is CSS Grid really slower than Flexbox?
Search for ‘is CSS Grid slower than Flexbox’ and you’ll find a few posts explaining that it is. In my experience, even if it was, it is not anymore. Well, not for the scenario I tested anyway.
The tests
I took 200 elements with a nested element. The DOM for each was like this:
<div class="wn-Item">
<div class="icon"></div>
item2
</div>
The CSS looked like this for the Flex variant:
.wn-PreMatchGroup {
position: relative;
display: flex;
flex-direction: column;
flex: 1 1 100%;
max-width: 500px;
margin: auto;
}
.wn-Item {
display: flex;
width: 100%;
align-items: center;
height: 45px;
gap: 0 10px;
}
.icon {
width: 20px;
height: 20px;
background-color: gold;
}
And like this for the Grid variant:
.wn-PreMatchGroup {
position: relative;
display: grid;
grid-template-columns: 1fr minmax(auto, 500px) 1fr;
}
.wn-Item {
display: grid;
grid-auto-flow: column;
width: 100%;
place-content: center start;
height: 45px;
gap: 0 10px;
grid-column: 2;
}
.icon {
width: 20px;
height: 20px;
background-color: gold;
}
The idea being that there was some computation to be done regarding the maximum width the column should be, and how the ‘gutters’ were made each side.
To measure performance I used a snippet from MDN:
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
console.log(
`The time to ${entry.name} was ${entry.startTime} milliseconds.`,
);
// Logs "The time to first-paint was 386.7999999523163 milliseconds."
// Logs "The time to first-contentful-paint was 400.6999999284744 milliseconds."
});
});
observer.observe({ type: "paint", buffered: true });
You can grab/view the files here: https://github.com/benfrain/css-performance-tests
Results
Take a look for yourself in the browser but over 20-30 refreshes of the page I see no significant difference, using Chrome 127 or Safari 17.6. 20 results below. I got bored after than…
Run | Chrome Flex | Chrome Grid | Safari Flex | Safari Grid |
---|---|---|---|---|
1 | 58.20 | 62.80 | 15.00 | 16.00 |
2 | 49.70 | 61.00 | 10.00 | 16.00 |
3 | 51.80 | 43.00 | 13.00 | 17.00 |
4 | 56.60 | 48.69 | 14.00 | 16.00 |
5 | 54.60 | 62.00 | 13.00 | 19.00 |
6 | 50.60 | 50.40 | 13.00 | 18.00 |
7 | 61.80 | 48.79 | 15.00 | 20.00 |
8 | 50.60 | 51.90 | 15.00 | 19.00 |
9 | 48.69 | 58.69 | 16.00 | 20.00 |
10 | 51.00 | 60.30 | 13.00 | 21.00 |
11 | 49.59 | 45.50 | 16.00 | 18.00 |
12 | 56.19 | 49.40 | 17.00 | 20.00 |
13 | 60.19 | 49.30 | 13.00 | 18.00 |
14 | 62.00 | 52.59 | 16.00 | 17.00 |
15 | 67.79 | 52.39 | 15.00 | 21.00 |
16 | 59.70 | 56.50 | 15.00 | 19.00 |
17 | 50.30 | 45.60 | 16.00 | 13.00 |
18 | 51.50 | 62.50 | 15.00 | 17.00 |
19 | 56.90 | 44.00 | 15.00 | 16.00 |
20 | 51.19 | 49.80 | 17.00 | 24.00 |
Average | 54.84 | 52.75 | 14.6 | 18.25 |
Summary
I’ve done a few of these kinds of tests over the years.
As ever, it is essential to test CSS performance dogma against your own real world scenario. I’m not saying Grid will never be a problem, or Flex for that matter. But don’t assume it will be either.
Great post! These days with the speed of machines both front-end and server side, I just roll my eyes when folks attempt to justify their code base choices based upon the speed of something…I never heard a user say, “I’m jumping ship cuz this site/app is a half millisecond slower than another!”…