Perchè il mio computer è così lento?

Processori superscalari che richiedono anni di progettazione da parte di team di centinaia di persone, RAM velocissime appoggiate da cache ancor più veloci, istruzioni a 64 bit, hard disk capaci di trasferire anche 50 MB in un solo secondo e ADSL da 6 Megabit. Ma come possono i computer di oggi andare lenti?

Se pensate che la cosa sia dovuta al carico di lavoro o colli di bottiglia vi sbagliate di grosso: ci sono pochissime applicazioni che richiedono realmente un’elevata potenza di calcolo e sono le seguenti.
– database enormi
– programmi di simulazione scientifica
– software per grafica 3D
– videogame con grafica moooooolto alta

Sapete a cos’è dovuto il rallentamento che percepite? Semplice, alla disottimizzazione più totale a tutti i livelli hardware e soprattutto software interessati dalle applicazioni. Pensate che il software venga “ottimizzato”?
No! L’unica ottimizzazione che il software subisce è quella da parte della CPU che riordina le istruzioni per evitare cicli di stallo, ovvero per non dover aspettare il risultato di un operazione mentre potrebbe eseguirne un’altra invertendo l’ordine nel codice sorgente del programma.

Doom 3 è scritto quasi interamente in DirectX 7.0! Altro che ottimizzazione, qui non abbiamo nemmeno lo sfruttamento delle funzionalità introdotte. Quando mai avete visto programmatori scrivere codice ottimizzato per MMX, SSE ed SSE2? Sono pochissimi le case che scelgono di sacrificare la compatibilità per le prestazioni, ancor meno quelle che scrivono più versioni del programma. Adobe Premiere è uno dei pochissimi software che gira solo su processori con supporto SSE2…

Del resto l’aggiornamento del computer, anche per chi ha le competenze per sostituire i singoli componenti, è tutt’altro che economico. I processori, le schede video, gli hard disk, le ram sono alcuni dei componenti che hanno cambiato connettori negli ultimi 3 anni…
E poi credete che raddoppiare la velocità del processore cambi qualcosa? No, inizierà a fare da collo di bottiglia tutto il resto… e anche cambiando completamente computer otterrete un miglioramento minimo rispetto a quello che ci si potrebbe aspettare.

Perchè? Semplice… Windows non gestisce NULLA in maniera ottimale. Linux è peggio e anche Machintosh si attesta a livelli simili. Facciamo un esempio. Quando un software entra in un ciclo infinito, assorbe il 100% del processore bloccando tutto windows potrebbe comunque terminarlo in un secondo. Perchè l’hardware di sistema gestisce una cosa chiamata interrupt che restituisce il controllo a windows ogni tot millisecondi. Sempre! Non è possibile che windows non rilevi che il software è bloccato e che l’utente vuole chiuderlo.

Stessa cosa per i cluster danneggiati. Anche se il controllo fosse a DMA un dispositivo permette a windows di riprendere il controllo ogni tot secondi e decidere cosa fare. Ovvio che tutte le scelte potrebbero andar bene tranne quella di bloccarsi…

I mille programmini inutili (servizi, dll, ecc) tra cui windows deve continuamente switchare richiedono continui cambi di contesto. Perchè non chiedere all’utente al momento dell’installazione se vuole autorizzarli o meno? E soprattutto perchè dividere in migliaia di processi se non c’è necessità di parallelismo? La verità è che i compilatori e gli strumenti di sviluppo del software fanno schifo. Sono a livello dell’assembler o poco più evoluti. Come gli italiani sono fissati a volere l’auto con le marce gli sviluppatori vogliono vedere il “codice”. Mentre oramai tutto dovrebbe essere fatto tramite un’avanzatissima interfaccia grafica che permetta di inserire vincoli, il riutilizzo del codice, lo sviluppo collaborativo e al contempo ottimizzi realmente il codice (riunendo più dll, riscrivendo procedure, proponendo altre soluzioni più razionali al programmatore).

Gli editor di sviluppo del software sono così primordiali da essere paragonabili ad un notepad evoluto. Cose come il refactoring del codice fanno quasi sorridere se si pensa che ormai le classi dovrebbero essere qualcosa di simile a plugin altamente configurabili, ottenuti unendo l’interfaccia e le funzionalità di diversi plugin e visualizzabili, editabili e migliorabili unicamente attraverso un’interfaccia grafica evolutissima.

Inoltre eliminare la disottimizzazione dal software richiede una revisione noiosisssssima da parte di programmatori veramente esperti e introduce bug che vanno poi eliminati. Sviluppare software secondo tale schema costerebbe 10 volte tanto il costo attuale. Facciamo un esempio. Se un’operazione comporta 1000 accessi all’hard disk leggendo il codice attentamente potrei rendermi conto che basta leggere 1 volta scrivere 999 volte in ram e 1 sull’hard disk. Il compilatore non può accorgersene (perchè è fatto malissimo)…

E se invece usassi i registri interni o ottimizzassi il tutto per non sforare dalla cache o dalla RAM? Ovvero usare l’hard disk rallenta 1000 volte rispetto a usare la ram e idem per la cache. Gli elementi di un software vengono gestiti spesso ad oggetti (che è incredibilmente inefficente) e le procedure magari vengono scritte in DLL esterne separando in programmi concorrenti operazioni che non hanno questa necessità e viceversa rendendo sequenziali operazioni che potrebbero essere concorrenti su processori hyperthreading o multicore.

E cosa dire dell’hardware? Ci vuole tanto a cambiare connettori degli hard disk, pci, processori, ecc realizzando un unico standard di connettore interno ed esterno tipo usb? E windows? A cosa servirebbe l’NCQ se windows non ciclasse continuamente tra mille operazioni di I/O su hard disk? Avete mai provato a effettuare più di un trasferimento alla volta? Windows switcha tra uno e l’altro ogni pochi KB, anche se questo non serve a nulla se non a rallentare di 5-6 volte entrambi i trasferimenti.

Insomma, la situazione è a dir poco penosa. Si potrebbe diventare miliardari solo mettendo in pratica qualcuna di queste idee. Un computer veloce decine di volte più di quelli attuali… che importanza può avere se il processore è solo a 1000 Mhz se poi il sistema operativo non esegue inutili operazioni di I/O per paging e simili?

LASCIA UN COMMENTO

Please enter your comment!
Please enter your name here

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.