Hacker News new | ask | show | jobs
by pcwalton 3282 days ago
> One frustrating component of the above breakdown is the time spent recalculating styles. At this point, it looks like the only way to solve this within the current paradigm is to use CSS less and reduce the number of selectors in the application, but that’s going to be a hard fought battle given the huge number of themes in the ecosystem.

This is a perfect example of why we need parallel restyling. :)

4 comments

I dunno, I'd say it's more an example of why CSS isn't the right abstraction for styles in a text editor…
CSS is more powerful than anything that popular native text editors can do. As far as I'm aware, in native text editors, generally, style can't influence (block-direction) layout, and that's why they can get away with determining what's visible before restyling. Once you have styles that can influence layout, this dependency is reversed, so any native text editor will have to restyle off-screen lines just as a browser must.

Is it worth restricting an editor to only styles that don't influence block layout? For example, should it be impossible for a theme to make comment lines taller or shorter? I don't know; it's a tradeoff between performance and flexibility. My feeling is that there's a lot more room to improve the implementation before we have to resort to reducing capabilities, but reasonable people can disagree.

Should it be impossible for a theme to make comment lines taller or shorter?

Of course not; everyting should be in the same damned monospaced font in a text editor for writing code.

My Emacs Org-mode setup already has larger font (and taller lines) for headings, so this isn't too crazy. Not everything in a text editor is code; some of it is text.
Why does code need to be monospaced? I feel like the only reason we all do it is that it's always been done like that so it feels wrong not to.

The only actual reason I can think of for it is alignment, and that seems like a minimal benefit really. Variable width text is generally considered easier to read, so why couldn't this also apply to code?

Alignment isn't a minimal benefit; it is super important.

It's not just for neatness; either. Alignment shows where differences are between similar lines. And not necessarily consecutive lines. For instance, if we rapidly flip the editing window back and forth between two buffers showing similar code, we can see the differences as the moving parts in a two-frame animation.

Even in proportional fonts, the digits 0 to 9 get the same width. Why? So that tables of figures will look reasonable.

We don't want 1111.11 looking narrower than the 100.00 in the preceding row.

I want everything to be crisply aligned between lines like:

   xr = x * cos(theta) - y * sin(theta);
   yr = x * sin(theta) + y * cos(theta);
This makes it easy to see where the differences are. Any gratuitous deviation from the alignment is visually distracting. I want to be able to scan the thing vertically y and see that I have two x's, two y's, cos/sin sin/cos, and -/+ at a glance.
This must be why math literature has been using fixed width fonts for hundreds of years! No way you could ever align something with (hugely more readable) proportional fonts. BTW, numerals are not automatically same width in proportional fonts; a good font will often have both (and for tables you'd explicitly switch to tabular figures, which will align properly).
>Why does code need to be monospaced? I feel like the only reason we all do it is that it's always been done like that so it feels wrong not to.

Because alignment.

>The only actual reason I can think of for it is alignment, and that seems like a minimal benefit really.

Most programmers I know would argue otherwise, including me. Wanna try a poll?

>Variable width text is generally considered easier to read, so why couldn't this also apply to code?

Because it's only considered "easier to read" for general text (books, articles, etc) where you don't need to quickly see anything standing out of the ordinary, and alignment doesn't matter.

Even for traditional uses like accounting, "variable width" is not considered easier to read.

Fuck knows why it couldn't - but in my personal experience code is infinitely more difficult to read without a monospaced font.
>CSS is more powerful than anything that popular native text editors can do

Which give even more credence to what the parent said: that "CSS isn't the right abstraction for styles in a text editor…".

We don't really need the "more power" in an editor, but we could use the less slugginess (and less conceptual overhead) than what CSS offer.

>Is it worth restricting an editor to only styles that don't influence block layout? For example, should it be impossible for a theme to make comment lines taller or shorter?

I'm pretty sure existing editors can do that today too, without CSS. Setting a different font size for comment lines for example.

If any editor has to restyle all lines, even lines that are off screen, and it supports declarative themes, then it must do the very same thing the browser does. And I suspect that any editor that does this styling will end up being slower than browsers are at this task, because of the sheer amount of optimization that has gone into browser styling at this point.
Why do you need style information for off-screen content in a text editor? It's not like you're going to have JS running that can query the computed style at any point. If it's for scrollbars then you can probably just use an approximation, or compute metrics without actually computing full style information.

Based on my limited experience, most text editors don't have correct information for off-screen content anyways, as they tend to do lazy syntax highlighting, which you can sometimes see adjusting while you scroll.

> Why do you need style information for off-screen content in a text editor? It's not like you're going to have JS running that can query the computed style at any point. If it's for scrollbars then you can probably just use an approximation, or compute metrics without actually computing full style information.

To know how high the editor is, for scroll bars, Sublime Text-style minimaps, etc.

Computing metrics basically requires computing full style information. Doing cascading for any property isn't much more expensive than doing cascading for all properties.

> Based on my limited experience, most text editors don't have correct information for off-screen content anyways, as they tend to do lazy syntax highlighting, which you can sometimes see adjusting while you scroll.

Sure. The way to do that in the Web platform is to do what Atom is doing here: adjust styles only when elements come into view. IntersectionObserver can be useful for that.

CSS gives a lot of power; I'd say too much for a code editor.

It would be great to have a small high-performance subset. The subset needs not have low expression power, though.

> Is it worth restricting an editor to only styles that don't influence block layout?

That includes font-* and many other attributes that affect text rendering. It isn't possible to know the length of a line of text without computing most of the text layout in modern font rendering. Font family/size/variant, weight, kerning, vertical hinting, traditional horizontal hinting, and LCD subpixel hinting all influence character positions at 1/256 pixel resolution. I highly recommend this[1] paper for a good overview of how this works, which includes an analysis of why Microsoft's older font handling caused serious layout issues (cumulative x-length error) due to over-hinting that forced glyphs onto the pixel grid.

> editors

Monospace fonts usually let you ignore most of these issues, but some (crazy?) people program with proportional fonts[2], and we can't actually ignore Unicode...

(I just use an 80/20 solution: fast - and predictable - Terminus and Dina bitmap fonts most of the time, and let Unicode distort the layout with other stuff as needed)

[1] http://www.antigrain.com/research/font_rasterization/index.h...

[2] https://news.ycombinator.com/item?id=1056683

This is a perfect example of why Atom should have been a native application to start with.
But Github is doubling down on Electron with their next github client on Mac/Windows etc. Also how would they write blogs about performance if it is plain old native text editor.
Also known as CV driven development.

I use TortoiseGit and IDEs to access Github.

Eh, I feel like the web platform as allowed it to be massively extensible in a much more convenient and familiar way than a lot of other editors. I tried it for a little bit and it felt like the "Sublime Text but more open and flexible" that I really wanted. If they can work out a way to improve performance without sacrificing too much of that, it would be great.
As an Emacs fan, not really.
This isn't about emacs. Atom is for people who want an alternative to Emacs. If you only need to know JS and CSS to write an extension, that vastly increases the pool of people who are able to write extensions.
That "pool" of people "able" to "write" "extensions" is exactly the people you don't want touching your text editor, or any software for that matter. Anyone that has a psychological barrier to take a look at a language that they are not familiar with, let alone a framework or an ecosystem, is not someone that I want being anywhere near the software I use. In an ideal world, I wouldn't want them to be anywhere near the web I visit either, but that is a lost cause.
The quality of Atom extensions is good, so that's clearly not true.

Also, you are going nuts with the scare quotes. I don't even see what point you are trying to make with those.

The difference is that Atom lets you build UIs; Emacs lets you mash together some text and images.
I though that was the purpose of a text editor, go figure!
Parallel restyling just kicks the can down the road, asking for free perf elsewhere because we still haven't made it fast. What we need is a low-level style interface - .style but for computed, not CSS-integrated, styles - and then to plug into that using CSS where appropriate, or custom JS where appropriate, or even framework JS. Let people control style selection in a real programming language and you've guaranteed that it can now be done in a way that's fast and suitable.
I don't necessarily disagree, but I'd like to reassess where we are in terms of performance once Typed CSSOM is widely used. Using Typed CSSOM to adjust the "style" properties of individual elements is awfully close to doing what you describe: the difference is that matching and cascading still happens, but the semantics become much simpler if you're adjusting individual styles, and it's not clear to me that most of the overhead can't just be optimized away at that point.
How would that work? Breakup the screen into chunks each CPU/GPU renders?
The same way Servo (and the work-in-progress Servo port to Gecko) does it. Compute styles for every DOM node in parallel, using a work-stealing scheduler to distribute nodes among threads in a thread pool. Parent nodes must have their styles computed before children, but other than that constraint it's an embarrassingly parallel problem.
In css sibling nodes can certainly affect the position of each other, but that might be ok. A harder problem will be siblings that "run in" to each other, and overlap in various ways.
I'm talking about styling, not layout.
Work-stealing scheduler, thread pool? What is going on here?

Have any of you seen the kind of stuff recent games draw in 16 ms? It's amazing! They sure as hell don't use a work-stealing scheduler in a thread pool for single vertices, though.

Games are at an advantage because they can do a lot of up-front processing. They can statically schedule their content based on knowledge of the hardware, and programmers can and do even tell the artists to tailor their content directly to the system. Conversely, on the Web, we can't do any of this: we have no idea what the content is going to be like until we receive it, and we have to handle specifications that were written without parallelism in mind. All of the decisions we make have to be dynamic rather than static, which is why work stealing is especially effective.

Besides, vertices are a much simpler problem than CSS styling. CSS supports hundreds of properties, all of which are parsed and cascaded differently. You have properties that are inherited and properties that are noninherited. You have properties that depend on other properties: for example, any lengths might be specified in terms of ems, which means you have to have resolved the font size first. You have properties that result in completely different render trees, for example "display". You can't effectively throw stream processors like GPUs at the problem (believe me, I've tried).

Could we do better? Sure. But every proposed replacement for CSS I've seen (e.g. Cassowary) has made the complexity problem worse. And most native styling solutions I've seen are usually just very slow implementations of CSS. Separating presentation and markup is just hard, no matter what.

> But every proposed replacement for CSS I've seen (e.g. Cassowary) has made the complexity problem worse.

Hi, what other proposed replacements for CSS do you know about? I'm interested in seeing what problems they ran into.

I need to go look at Cassowary again. IIRC it's a solver, so sometimes the layout won't be what you expected, and it's very hard to know what to change such that it does what you want.

Cassowary was admittedly a bad example, because it's a layout algorithm rather than a style system. But I've seen folks suggest that we just replace CSS with TeX, for example. Using TeX would make this problem a lot worse, because styling TeX involves expanding textual macros. You would lose any possibility of parallelism, ever.
Or to put it in other words: browser technology is asked to do so much that they had to go invent a new language to keep up. So that they could serve ads.

For us ordinary folks trying to write good applications that can be maintained by one person and scale reasonably well, there's justifiable reason to jump off this rollercoaster and work in a more humble environment with modest perf/safety tradeoffs and native code executables(e.g. Go, Basic, Pascal).

The "so they could serve ads" meme is facile, reductionist, sophomoric. Actually, the fact that Google et al. were able to identify a profit function that could be optimized to fund the last 15 years of technology is an incredible achievement. In ~2000 it wasn't at all obvious that the internet could find a robust funding model.

Where the funding comes from is practically irrelevant, specially if it is a feedback function (i.e., an economic phenomenon, not "phone the legislature to fund more research!!1").

New funding models are good, too, of course. But the tone of the anti-ad camp is asinine.

A realpolitik view of tech only holds under the assumption that any new technology is good technology. It allows nothing to balance or sustainability, and I believe the trajectory of the Web is unsustainable and therefore fundamentally doomed despite its near-term wonders.

The SV camp has said nothing to convince me otherwise.

>Where the funding comes from is practically irrelevant, specially if it is a feedback function (i.e., an economic phenomenon, not "phone the legislature to fund more research!!1").

I preper phoning the legislature -- more democratic and less private interests-driven.

Games do, however, use job systems just like that for plenty of things that aren't single vertices.
Games are a completely different problem space. "styling" is a concept that games don't have; games don't deal with deciding which thing has which style at runtime. Browsers do, because they are just given CSS and have to handle the cascading and assigning of styles on their own.
> "styling" is a concept that games don't have

I disagree. Look up how modern material systems work. There absolutely are analogous things going on to CSS in PBR rendering, shaders, multipass compositing etc.

Of course they do, modern games are a complex interaction of many different shaders operating on all levels of abstraction on many different classes of runtime data that they compose, renew and adapt many many times in 16 ms.

Is the whole CSS debacle a particularly unlikely concept to yield anything close to a reasonable performing implementation? Sure, but that is because nobody has applied the pressure necessary. People won't play a game that doesn't consistently meet a 30 ms deadline but they seem to happily put up with 3 seconds to final render and call it "amazing".

Shaders are a completely different thing from styling (cascading).

GPUs work here because games fundamentally operate on a list-like datastructure (the display list), with little interdependence.

Styling on the other hand operates on a tree like datastructure (the DOM), with lots of interdependence.

Cascading isn't something games need at all, and if it was, it could be precomputed. THis can't be done in webpages.