My main loop is something like this:
10 STYLING
20 LAYOUT
30 PAINTING
40 GOTO 10
At styling and layout I use dirty flag managment, so that branches of the component tree is restyled or layed out only if needed. This kind of dirty-management makes stuff a bit more complicated than otherwise, but this is a tradeoff. At painting I did not implement caching (painting to a memory buffer) and dirty flag management yet, but here I will also do optimizations in the future. This is a bit tricky, as painted components can have alpha/trasparency.
The most serious bottleneck will be probably painting (everything else can be addressed with algorithmic optimizations).
At the beginning of the project I've looked at canvas painting benchmarks, and I decided canvas performance is already quite good. The slowest is drawing texts, but even that is not that terribly slow. I expect that canvas performance will improve in the browsers in the future so time works for me.
Currently my samples' performance feels acceptable, although I did not do serious performance tests yet (and as I mentioned I did not implement the most agressive optimizations regarding painting yet.)
TL;DR: Making this fast is quite challenging, but not undoable I think.