Also C++ devs who took Abrash's "measure to know the performance of something" waaaay to seriously.
Like, I can know certain practices hinder performance of things without measuring.
This is something I find really really interesting about a lot of C++ devs. The language is supposed to be all about performance, but a lot of the arguments are about best practice within the language, proper architecture, avoiding footguns, and so often arguments specificly about high performance architectures are scoffed at in favor of "proper OOP" or assuming that you can't know something is high performance without measuring.
It's baffling.
As an aside, It reminds me of a discussion on some Swift forum about the performance of Arrays vs. ContiguousArray. Their testing showed no performance difference between the two (with Array actually being faster), and no one haad any answers as to why you would use one over the other.
The answer is cache that ContiguousArray can be more cache coherant in tight loops. But so few people know that and can come up with real tests that show the difference, so everyone just uses Array.
@belvo that is a very long and involved discussion.
The short(-ish) answer for me is that that statement really refers to algorithms over design. Internal algorithms are easy to change. Design is not. And some designs are just straight worse for performance on a modern cache based CPU.
The flip side of that statement is "Don't prematurely pessamize." And we unwittingly do it all the time, trapping ourselves into well intentioned complex OOP architectures that can't actually push performance.
@belvo for example using the statement before: imagine you write Swift and you process a large amount of data enclosed in classes. You put those classes in an Array and process them in a thread. This runs slow but you have optimized every instruction.
Now, changing to ContiguousArray might get you better cache performance, but requires your class be a struct, a huge breaking change that could have massive impacts everywhere that class is used, depending on how its used.
@belvo So, this was the general response from a co-worker. But we *know* cache misses are orders of magnitude slower than any other instruction issued by a CPU -- this is documented overhead. But a cache miss vs hit has so many prerequisetes that it's hard to even come up with artifical tests that will cause cache misses.
So data design becomes one of the few ways to ensure you're using your processor efficiently, and avoiding cache misses.

@fuzzybinary Definitely makes sense in the context of the ContiguousArray post sibling to this one too.
It also leads me into my mixed feelings around the statement of “pre-emptive optimization is the root of all evil.” On the one hand, min/maxing performance before an app is “done” is almost counter-productive, on the other hand lived experience usually says “I’ll probably have to do this eventually, it will look a bit ugly and not measure much now — but it’s saved my butt before!”
@pux0r3 I love one of the first best practices in C++ Best Practices: "Don't prematurely pessamize".
And you're right that some things are now dumb because the compiler can optimize it better than you, but specifically in C++ it *can't* rearrange data. And it can't skip constructors or destructors in certain circumstances. And it can't optimize away the v-table jump.
@raptor85 @fuzzybinary Ha, -noexcept and -nortti are even better examples of what I was thinking of too. I’ve worked in code bases that worked better on both sides of those flags 😆
I tend to play with different languages for fun, and I always end up back at C++ because it’s not _that_ broken and I can usually slurp in whatever I thought was cool from my latest round of new language spelunking. Just don’t tell the Rust devs that I’m not (yet) totally sold on the borrow checker.
@fuzzybinary @raptor85 the initial argument against exceptions at my first job was a vague "it's slower usually" mixed with "look at all this extra assembly this generates, do you want to read this?"
Now, even if it were slower (which I love this article for 😆), I've been radicalized into thinking it can be clearer to read and manage than piles of "if error" checks or the infamous `goto error` - and therefore faster in the "I can better reason about my code structure" way.