This mixin overrides the default identity-based hash code with a stored integer hash code. That made a big difference in the old formatter's performance but for most of the times I tried it with the new one, it didn't help. But it seems that the new formatter is storing pieces in maps enough for it to make a difference.
Current formatter 10.138 ========================================
Optimized 9.490 =====================================
Old formatter 4.812 ==================
The current formatter is 52.54% slower than the old formatter.
The optimized is 6.83% faster than the current formatter.
The optimized is 49.29% slower than the old formatter.
The optimization gets the formatter 12.17% of the way to the old one.
That's pretty good for a one line change.
Also, this makes debugging the new formatter easier because now each Piece has a different debug string. Trying to figure out which of a hundred Infix pieces is the one you want gets pretty tedious...
This mixin overrides the default identity-based hash code with a stored integer hash code. That made a big difference in the old formatter's performance but for most of the times I tried it with the new one, it didn't help. But it seems that the new formatter is storing pieces in maps enough for it to make a difference.
On the microbenchmarks:
And when formatting the Flutter repo:
That's pretty good for a one line change.
Also, this makes debugging the new formatter easier because now each Piece has a different debug string. Trying to figure out which of a hundred
Infix
pieces is the one you want gets pretty tedious...