posts - 644, comments - 2003, trackbacks - 137

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

Architettura e performance

Sono daccordo con il recente post di Mauro e quindi con l'affermazione di Tommaso: "Se non è semplice c'è qualcosa che non va". Questa è stata la mia impressione in diversi lavori che ho visto, ma qui prepotentemente si insinua un altro problema: le performance.

Si, abbiamo macchine da 4GHz, ma certe scelte costano care anche su macchine superveloci.

Si, entro 5 anni arriveremo a 80 core, dice Intel (poi quando parlavo dei 16 core mi davano del visionario), ma sfruttarli per bene non è affatto semplice e gli strumenti sono ancora pochi (tra l'altro questi saranno proprio gli argomenti di una delle mie sessioni ai Community Days).

Ma ...

Ma recentemente ho toccato con mano che alcune scelte architetturali costano in performance e sono di tangibile fastidio all'utente che usa l'applicazione.

Factory, Proxy, MVC, MVP, Adapters, ... sono fantastiche soluzioni by design ... se si chiamano pattern significa proprio che sono stati usati con successo da migliaia di developer e quindi su questo non si discute. Il problema è chi li usa smile_regular.

  • La prima considerazione è che il disegno dell'applicazione è e rimarrà un passo fondamentale per la creazione di una applicazione, e che quegli strumenti sono validissimi.
  • La seconda considerazione è che lo sviluppatore e l'architetto devono dialogare per capire fin dalla stesura dell'architettura per capire quali possano essere i colli di bottiglia e non finire col piangere davanti ad un profiler.
  • La terza considerazione è che le performance vanno misurate perché è troppo facile dare la colpa al mancato uso di StringBuilder o all'architetto eccentrico, ma devo ribadire che se alla performance non ci si pensa fin dall'inizio, alla fine si fa prima a riscrivere, il che è quanto di peggio possa accadere.
  • La quarta considerazione è che i problemi di performance dovuti all'architettura ci sono a prescindere dall'ambiente di sviluppo e possono accadere anche con la programmazione nativa in C++. Solo che chi programma in C++ non ha strumenti insiti nel linguaggio per componentizzare (i componenti ci sono se si usa COM, Corba, Framework, ...) e quindi tipicamente l'architettura è più spartana.
  • Infine quello che ritengo sarà la soluzione ottimale e il miglior compromesso: la generazione di codice. Alcune scelte architetturali sono legate all'uso di tecnologie come Reflection, potenti ma anche arma a doppio taglio.

Concludendo, non sempre fare i "perfettini" con l'architettura paga, anzi tutt'altro.

Quindi tornando al post di Mauro aggiungo che l'architettura non deve essere solo semplice ma anche un compromesso con le tecnologie e i linguaggi che si stanno utilizzando. Non credo alla pura architettura riusabile meno che mai in modo trasversale sul Framework, su Java, su COM, etc. L'architettura si deve 'sporcare', quando è necessario, perché il nostro è il regno della tecnocrazia.

Paragone con un algoritmo di calcolo: lo scrivo in C++ e lo traduco in C# (o viceversa).
Funziona? Si. È efficicente? No, nella gran maggioranza dei casi perché lo strumento ha delle differenze notevoli da cui non possiamo prescindere.

Print | posted on venerdì 20 giugno 2008 12:43 |

Feedback

Gravatar

# re: Architettura e performance

X Raffaele: Ok siamo in sintonia.
Per farti un esempio di mania delle performance durante lo sviluppo in pair con un collega è stato scritto il seguente codice:

for(int i = laps.Count - 1; i >= 0; i--)
{
...
}

io gli ho chiesto per quale motivo scorresse la lista al contrario, la risposta è stata che così Count veniva letta una sola volta (ovviamente è vero). Io ho ribattuto che ogni volta che qualcuno guarderà quel codice si farà questa domanda e visto che la property Count ha un costo praticamente nullo (return della property Count di un oggetto List) perferisco:

for(int i = 0; i < laps.Count; i++)
{
...
}

In cui se ne guadagna in leggibilità.


20/06/2008 15:19 | Antonio Ganci
Gravatar

# re: Architettura e performance

Raffaele, sono perfettamente d'accordo con te. L'architettura deve essere sempre un mezzo, e non il fine. Altrimenti è pura accademia. Un saluto!
20/06/2008 15:25 | Davide Senatore
Gravatar

# re: Architettura e performance

@Andrea. Siamo daccordo e infatti parlo di aspettativa dell'utente.
Quei developer che aspettano che le performance arrivino dai processori più nuovi ormai dovranno cambiare strada. Herb Sutter dice "The free lunch is over" parlando proprio di questo (BTW questo è il titolo della mia sessione ai community days!)

80M record. Non c'è risposta senza avere il contesto, direi che questo è ovvio.
P4 per far funzionare XP. Non sono daccordo, oggi gli OS fanno tantissime cose di più e il libro + articoli di Russinovich sono lampanti. Puoi dire che a te non serve ma oggi le biciclette con una ruota grossa e una piccola non le produce più nessuno anche se funzionerebbero.

@Antonio. Se compili in release non c'è differenza ;-) Il problema è che molti dimenticano la versione release :)))
Cmq concordo sul discorso di fondo. La performance a tutti i costi non serve. Ma lo stesso vale per l'architettura!!!

@Davide. Ciao!
20/06/2008 15:33 | Raffaele Rialdi
Gravatar

# re: Architettura e performance

Mi smbra che sia Andrea che raffaeu sottolineino l'esigenza di guardare prima di tutto ai requisiti del cliente. Beh se è così sono quasi totalmente daccordo. Dico quasi perché per raggiungere lo scopo ci sono tanti modi e tra questi ci può anche essere del software scritto "malino".
Il problema che ho voluto sottolineare è che mi è capitato di vedere l'approccio opposto. Super strutturazione a scapito delle performance che *il cliente* si aspetta di avere.

@Luka. No o perlomeno non ne faccio un'equazione. Io parlo di quei casi (assolutamente non rari) in cui la cura quasi "estetica" dell'architettura cozza di brutto con i requisiti di performance e ottimizzazione. Dico anche che l'architettura impatta ma ovviamente dipende da come viene fatta e dal contesto. Se strutturo dei layer di astrazione su un algoritmo di calcolo sto fallendo totalmente perché il calcolo vuole prestazioni allo stato puro. Se strutturo perché le performance/memoria non ne soffrono ed è positivo per la gestione del ciclo di vita dell'applicazione (ivi compresa la sicurezza, quindi la semplicità a cui accennava Mauro), allora si che un buon disegno architetturale è prezioso.
20/06/2008 23:14 | Raffaele Rialdi
Gravatar

# re: Architettura e performance

Lo spartiacque è semplice se sai prevederlo per tempo, altrimenti non lo è "by design" :)
Se il problema fosse ridotto a una sola classe, la parte di ottimizzazione sarebbe facilmente riducibile ad una banale riscrittura di un'algoritmo ben isolato dal resto del codice. Cosa che ha un impatto minore rispetto ad una architettura inefficiente perché il numero di layer inserisce una serie di delay non accettabili. Quindi la scelta è indifferente se non hai modo di prevedere la sua performance.

Quando parlo di architettura però, io non alludo ad una semplice classe o gerarchia di classi, quella tra l'altro se la può sbrigare anche un developer con un po' di esperienza. L'architetto deve andare ben oltre.

Infine no, non prediligo le performance ad ogni costo (e l'ho già scritto). Sto dicendo che bisogna fare una attenta valutazione che l'architettura non spinga il progetto fuori dai limiti di usabilità che l'utente si aspetta.

P.S. certi algoritmi sono "performance first" sempre. Molti anni fa ho scritto un algoritmo di elaborazione immagini sia usando classi C++ che assembler x86. L'assembler andava più veloce. Non per questo mi metterei a scrivere in assembler una UI (come so che qualcuno faceva ancora fino a pochi anni fa). Il mio post è per sottolineare che non è possibile trascurare le performance come fattore centrale nella redazione di una architettura.

P.S.2 Non mi stupisce poi che sui libri di architettura non si trovi cenno a queste cose. Fowler non parla neppure di sicurezza nelle architetture eppure è un tema che non può che essere affrontato nella fase architetturale. Se non c'è, non significa che non sia importante ;)
21/06/2008 12:57 | Raffaele Rialdi
Gravatar

# re: Architettura e performance

@Andrea. Ok allora siamo pienamente daccordo.
Per il workshop non lo escludo, sai che sono venuto molto volentieri l'altra volta. Dipende dagli impegni ;)
21/06/2008 18:27 | Raffaele Rialdi
Gravatar

# prima regola dell'ottimizzazione: Don't do it!!!! ... forse

>> Il mio post è per sottolineare che non è possibile trascurare le performance
>> come fattore centrale nella redazione di una architettura.

non ho certo l'esperienza per discutere di questi argomenti nel caso specifico delle tecnologie di cui parlate..

ma in generale concordo!!!

La famosa prima regola dell'ottimizzazione (che a mio parere andrebbe riformulata) dice "don't do it"
che non vuol dire "don't think about it"!!!

Tanto e' inutile menarsela quando scegli di usare questa o quella tecnologia stai gia' facendo volente o nolente una scelta di performance... visto che qualunque tecnolgia ha i suoi limiti per questa piuttosto che quella operazione...

quindi e' inutile fare finta che si possa non pensarci e rimandare a dopo.
01/07/2008 20:21 | Guido
Gravatar

# re: Architettura e performance

Raffaele,

ho letto la tua risposta ad Antonio Ganci sulla differenza fra
for(int i = laps.Count - 1; i >= 0; i--)
e
for(int i = 0; i < laps.Count; i++)

Se ho capito bene la tua risposta, sostieni che in compilazione Release non c'è differenza. Non ti seguo. L'exe generato è praticamente lo stesso sia in Debug che Realse, ed in entrambi i casi con il secondo tipo di ciclo, la proprietà count viene controllata ad ogni giro. Che poi sia molto veloce controllare List.Count è un'altr discorso.

Ho verificato il codice con Reflector.


Ma forse non ho capito bene la tua risposta.

17/07/2008 13:15 | Fabrizio
Gravatar

# re: Architettura e performance

Ciao Fabrizio,
sto rifacendo alcune prove da capo. La fretta è cattiva consigliera. Dammi solo un po' di tempo.
Scusa se questo porta a confusione.
17/07/2008 19:17 | Raffaele Rialdi
Gravatar

# re: Architettura e performance

Ciao Fabrizio, hai ragione non c'è differenza.
31/07/2008 22:47 | Raffaele Rialdi
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET