In response to my post evangilizing string.format, Travis commented that my advice was wrong, and that it was "pathetic" to give priority to mere code cosmetics rather than performance. It's obvious that Travis feels strongly about the topic - as do I.
In some cases I think Travis is right. For example, if you're building a missile guidance system, or a video game, or maybe software that drives a heart pump. But for _any_ piece of software where you adopt a general-purpose managed language (like C#, VB.NET or Java), well, I think Travis is dead wrong.
I'll be the first to admit that I've never actually done performance testing on String.Format - but I have looked inside the class at how it works. True enough, there's a lot going on in there.
My point though is that in this day and age, the primary cost of developing software is maintenance. I've seen some studies pinning maintenance at over 100% of the total cost of ownership. In other words, the money you'll save by making code readable and maintainable is going to eclipse your hardware cost. But even that isn't really my main issue with what Travis said, because, in my humble opinion, Travis is guilty of massive premature micro-optimization. I'm pretty sure that even on outdated hardware (say a 5 year old computer), the difference in the majority of cases is going to be completely unnoticeable.
Of course, in cases where it is noticeable, you create nice code first, profile, and optimize. Travis seems to be suggesting you skip the first two step. I'm sure someone has a clever saying about this. (Both Red-Gate and JetBrains offer good .NET profiler, I highly suggest one or the other).
It’s one of those 80/20 things. Optimizing the first 80% tends to be relatively easy, but it quickly gets a lot harder to find anything else. Once you've identified and implemented the two or three big hits, things become a lot harder to tweak. If you're having performance issues, look at table indexes and caching opportunities. I've seen single indexes improve performance by orders of magnitude.
The fairly linear evolution of computer languages is directly related to hardware advances. C was possible as an abstraction above assembly because of it. Same goes for OO, garbage collectors, exceptions, webcontrols and advanced formatting.