gik25
18-03-2005, 17:06
Inizio inserendo qualche piccolo contributo.
Prestazioni
Esistono dei programmi chiamati profiler che permettono di analizzare il codice di un programma per trovare i colli di bottiglia. Forniscono in output il numero di volte che un'istruzione viene eseguita e il tempo impiegato (non è affidabilissimo).
Stringhe in cicli for
Se dovete eseguire un'istruzione mille volte la classe string non è adatta.
Vi faccio un esempio. Per tutti i file di un direttorio (1000) carica il testo in una stringa ed elimina i doppi spazi.
Un modo di farlo è eseguire
while(trovato_spazio_doppio)
{
stringa = stringa.Replace(" "," ");
}
Metodo in realtà pessimo e capace di impallarvi il computer per 20 secondi (per 100 file)!
Il metodo corretto è usare la classe StringBuilder.
Es.
StringBuilder stringa2 = new StringBuilder(stringa2)
while(trovato_spazio_doppio)
{
stringa2.Replace(" "," ");
}
si noti che mentre le stringhe sono oggetti immutabili passate sempre e solo per valore, gli oggetti StringBuilder sono passati solo ed esclusivamente per riferimento.
scrivere strnga2 = stringa2.Replace(" "," ") è un errore (in quanto rallenta di una decina di volte l'esecuzione del codice e non introduce alcuna differenza)
Utilizzare un oggetto modificandolo ma recuperare una copia intatta di esso alla fine del task
Se utilizzate un oggetto modificandone i campi perderete i valori originali. Anche se credevate di averli salvati. Per la precisione questo avviene se la modifica è fatta per riferimento.
Es.
object backup = originale;
ModificaPerRiferimento(originale);
originale = backup;
//scopro che originale è cambiato insieme a backup
Prestazioni
Esistono dei programmi chiamati profiler che permettono di analizzare il codice di un programma per trovare i colli di bottiglia. Forniscono in output il numero di volte che un'istruzione viene eseguita e il tempo impiegato (non è affidabilissimo).
Stringhe in cicli for
Se dovete eseguire un'istruzione mille volte la classe string non è adatta.
Vi faccio un esempio. Per tutti i file di un direttorio (1000) carica il testo in una stringa ed elimina i doppi spazi.
Un modo di farlo è eseguire
while(trovato_spazio_doppio)
{
stringa = stringa.Replace(" "," ");
}
Metodo in realtà pessimo e capace di impallarvi il computer per 20 secondi (per 100 file)!
Il metodo corretto è usare la classe StringBuilder.
Es.
StringBuilder stringa2 = new StringBuilder(stringa2)
while(trovato_spazio_doppio)
{
stringa2.Replace(" "," ");
}
si noti che mentre le stringhe sono oggetti immutabili passate sempre e solo per valore, gli oggetti StringBuilder sono passati solo ed esclusivamente per riferimento.
scrivere strnga2 = stringa2.Replace(" "," ") è un errore (in quanto rallenta di una decina di volte l'esecuzione del codice e non introduce alcuna differenza)
Utilizzare un oggetto modificandolo ma recuperare una copia intatta di esso alla fine del task
Se utilizzate un oggetto modificandone i campi perderete i valori originali. Anche se credevate di averli salvati. Per la precisione questo avviene se la modifica è fatta per riferimento.
Es.
object backup = originale;
ModificaPerRiferimento(originale);
originale = backup;
//scopro che originale è cambiato insieme a backup