|
Vogliamo individuare dei criteri "oggettivi" da usare per scegliere tra due algoritmi, risolutivi dello stesso problema, quello che offre prestazioni migliori... Correttezza dell’algoritmoUn algoritmo risolve un problema se dà risposte esatte per ogni istanza del problema. Conviene allora prevedere subito le successive fasi di debugging utilizzando un ambiente di sviluppo integrato o aggiungendo delle istruzioni adatte allo scopo. Interfaccia utente del programmaLa facilità d’uso per l’utente finale è quasi sempre determinante nell’acquisto di un sistema (anche la piacevolezza dell’interfaccia grafica...). Comprensibilità e modificabilità del codiceUn codice molto efficiente, secondo certi criteri, ma incomprensibile per chi non lo ha realizzato potrebbe diventare inutilizzabile. Spesso del codice risulta incomprensibile anche all’autore stesso se è passato molto tempo dalla stesura (perché non lo ha documentato). Velocità e dimensione dell'eseguibileHardware, S.O, Linguaggio di programmazione, Compilatore, ... concorrono alle prestazioni finali del codice ma ipotizziamo che siano fissati. Diventa significativo ottenere per il prodotto finale velocità massima e dimensione minima. La concorrenza non aspetta che venga messo in commercio un microprocessore più veloce di quello attuale, nel frattempo migliora le prestazioni del suo prodotto! La velocità di esecuzione di un programma è condizionata dalle diverse velocità di accesso e diverse capacità dei dispositivi di memorizzazione.
E’ evidente che utilizzare strutture dati quanto più piccole possibile significa garantire ad esse maggiore vicinanza al microprocessore, quindi maggiore velocità di accesso e quindi minor tempo d'esecuzione.
Del resto non è possibile rinunciare alla potenza dei dati strutturati oppure all’uso dei file in quanto unica possibilità di rendere permanenti i dati. L’uso dei sottoprogrammi rallenta l’esecuzione del codice perché richiede l’allocazione dinamica dei parametri (1) e delle risorse locali (2) oltre che la chiamata (gosub) (3) e il ritorno al chiamante (ret) (4). Si tratta di operazioni che provocano sicuramente un rallentamento nell'esecuzione. Rinunciare ai sottoprogrammi è un problema che si può risolvere solo caso per caso: se una procedura viene chiamata poche volte si può pensare di eliminarla inserendo direttamente il codice dove serve senza per questo aumentare troppo la dimensione dell’eseguibile. ConclusioniTutti i criteri che non riguardano l’algoritmo ma la sua codifica non fanno parte della teoria degli algoritmi, che restringe il suo campo d’azione, allora, al consumo "atteso" di risorse hardware generiche ma sempre presenti: CPU, RAM, MM (memoria di massa). Il consumo di memoria porta a definire dei criteri di complessità in spazio mentre quello della CPU viene caratterizzato dalla complessità in tempo (di occupazione della CPU). Di nuovo dobbiamo trascurare tutti i giudizi tecnici sulle diverse possibilità di acquisto ma dobbiamo concentrare la nostra attenzione sull’algoritmo risolutivo... Se diamo per scontato che tutti i criteri precedenti siano sempre applicati allora non rimane che mettere in discussione le singole istruzioni, cioè l’algoritmo. |
|