Flame Graph — Node.js Server-Side Rendering of a Category Page
A --cpu-prof capture of a Node.js server rendering a 120-product category page (3,220 samples): 19.9% goes to constructing a new Intl.NumberFormat for every price, the 25.9% spent parsing and re-serialising the catalogue payload says the page ships far more data than it shows, and garbage collection takes 14%. Illustrative values.
Make it your own.
title "SSR /c/[category] — node --cpu-prof, 3,220 samples (illustrative)"
# node --cpu-prof server.js; then collapse the .cpuprofile to folded stacks
node;processTicksAndRejections;next-server:renderToHTMLOrFlight;react-dom/server:renderToReadableStream;react-dom/server:renderElement;ProductGrid;ProductCard 820
node;processTicksAndRejections;next-server:renderToHTMLOrFlight;react-dom/server:renderToReadableStream;react-dom/server:renderElement;ProductGrid;formatPrice;Intl.NumberFormat 640
node;processTicksAndRejections;next-server:renderToHTMLOrFlight;react-dom/server:renderToReadableStream;react-dom/server:renderElement;Header;MegaMenu 210
node;processTicksAndRejections;next-server:renderToHTMLOrFlight;getServerData;fetch:catalogue-api;JSON.parse 455
node;processTicksAndRejections;next-server:renderToHTMLOrFlight;getServerData;fetch:catalogue-api;undici:Client.request 120
node;processTicksAndRejections;next-server:renderToHTMLOrFlight;serializeProps;JSON.stringify 380
node;processTicksAndRejections;next-server:renderToHTMLOrFlight;compression:gzip;zlib:deflate 145
node;(garbage collector);v8::internal::Heap::Scavenge 290
node;(garbage collector);v8::internal::MarkCompactCollector::CollectGarbage 160