Scripts that grow in step with their work, layouts laid out once, and colours mixed like the reference
Pages run their scripts faster: arrow functions and type checks now run in compiled code, slicing a long string no longer copies it, and script patterns whose cost grew much faster than their input now grow in step with it, so a news page spends almost half as long in its scripts. A box a page lays out again with the same inputs keeps its layout instead of being laid out from scratch, web fonts and script modules load at once instead of one after another, color-mix() colours match the reference browser digit for digit, and a photo caption that lost all but its last word reads in full again.
Scripts that grow in step with their work
A sweep timed about sixty everyday script patterns at one size and at four times that size: a pattern that takes sixteen times as long has a hidden quadratic step. It found eleven. Building a string a piece at a time, reading .length in a loop, cutting tokens off the front of a long string, running a global regular expression over a page, adding thousands of keys to an object and clearing many timers all slowed down with the square of their size; nine are now linear, and the sweep runs on every change so new ones cannot creep back in.
Copies a program can never see are not made
Modern code updates state by building a new object from the old one: reduce((acc, x) => ({...acc, [x.id]: x}), {}) copies the whole accumulator on every step, so twenty thousand items mean two hundred million copied properties. When the engine can prove that nothing else holds the old object, it now updates it in place, which is indistinguishable to the program and turns a quadratic loop into a linear one. Object spreads also copy their source at the point where they stand, as the standard says.
Boxes laid out once
A grid lays each item out to measure it and again to place it, and a grid inside a grid multiplies that, so on a documentation page some boxes were laid out 38 times per pass. When a box is laid out again at the same place with exactly the same inputs, it now keeps the layout it already has. A check mode lays every reused box out for real as well and compares the whole subtree; it found no difference on any test page or test suite.
Arrow functions and type checks in compiled code
Arrow functions are most of the callbacks and small helpers in modern code, and every one of them ran in the slowest tier, however often it was called. A hot arrow function now runs in compiled code like any other function when it does not reach for this or arguments. typeof checks written either way round, and key in object tests, now stay in compiled code as well.
color-mix() mixes like the reference browser




color-mix() mixes two colours in a colour space the page names. Mixes in hsl and hwb, and the hue directions (shorter, longer, increasing, decreasing), were painted as a plain mix of red, green and blue: red and blue in hsl gave purple instead of magenta. Every space and hue direction is now mixed and painted the way the reference browser does, and getComputedStyle reports the mixed colour in the syntax the reference reports, digit for digit.
A caption that keeps all its words




A box laid out a second time chose between laying its content out as lines of text or as blocks by looking at what its first layout had produced, not at its real content. On a news site's photo carousel that sent the caption down the wrong path on its second layout, and only its last word survived, underlined across the whole photo. The choice now always looks at the content itself.
What changed 13 changes
Try it in your browser
Each check runs live in the browser you are reading with. Nothing is sent anywhere.