Sono pienamente d'accordo su quanto affermato nel post Why optimizing without profiling is inefficient riguardo alle ottimizzazioni premature.
Per me che ho iniziato a sviluppare sotto DOS con grossi limiti di memoria e performance è stato difficile iniziare a ragionare sull'architettura del sistema senza pensare a priori alle ottimizzazioni.
Il grosso problema delle ottimizzazioni premature è che rendono il codice poco leggibile; non solo, a volte le perfomance globali del sistema non migliorano perchè il collo di bottiglia è da un'altra parte.
Questo non significa di ignorare il problema, ma semplicemente che le performance vanno misurate in modo da capire esattamente cosa rallenta un sistema.
Un esempio eclatante l'ho vissuto quando ho iniziato a sviluppare in C#, per pigrizia, per confrontare due stringhe ignorando il case, utilizzavo il metodo ToLower come segue:
if (s1.ToLower() == s2.ToLower())
{
// ...
}
Subito ho pensato che il motivo della lentezza dell'applicazione fosse l'accesso al database, utilizzando un profiler ho scoperto che il collo di bottiglia era il compare tra le stringhe!
Sostituendo il confronto precedente con:
if (string.Compare(s1, s2, true) == 0)
{
// ...
}
Ho avuto un bell'incremento di performance.
P.S.: Questo è il centesimo post del mio blog, sembra incredibile di averne scritti così tanti; quando ho iniziato mai avrei immaginato di avere la costanza di continuare a postare per tanto tempo.