Hai mai provato a riassumere tutti i numeri da 1 a 2.000.000 nel tuo linguaggio di programmazione preferito? Il risultato è facile da calcolare manualmente: 2.000.001.000.000, che è circa 900 volte più grande del valore massimo di un intero a 32 bit senza segno.
C # stampa -1453759936
- un valore negativo! E immagino che Java faccia lo stesso.
Questo significa che ci sono alcuni linguaggi di programmazione comuni che ignorano l'overflow aritmetico di default (in C # ci sono opzioni nascoste per cambiarlo). Questo è un comportamento che mi sembra molto rischioso, e non è stato il crash di Ariane 5 causato da un tale trabocco?
Quindi: quali sono le decisioni di progettazione dietro un comportamento così pericoloso?
Modifica:
Le prime risposte a questa domanda esprimono i costi eccessivi del controllo. Eseguiamo un breve programma C # per testare questa ipotesi:
Stopwatch watch = Stopwatch.StartNew();
checked
{
for (int i = 0; i < 200000; i++)
{
int sum = 0;
for (int j = 1; j < 50000; j++)
{
sum += j;
}
}
}
watch.Stop();
Console.WriteLine(watch.Elapsed.TotalMilliseconds);
Sulla mia macchina, la versione controllata prende 11015 ms, mentre la versione deselezionata prende 4125 ms. Cioè i passaggi di controllo richiedono quasi il doppio della somma dei numeri (in totale 3 volte l'ora originale). Ma con le 10.000.000.000 di ripetizioni, il tempo impiegato da un controllo è ancora inferiore a 1 nanosecondo. Potrebbero esserci situazioni in cui ciò è importante, ma per la maggior parte delle applicazioni ciò non avrà importanza.
Modifica 2:
Ho ricompilato la nostra applicazione server (un servizio di Windows che analizzava i dati ricevuti da diversi sensori, con un certo numero di crunch coinvolti) con il parametro /p:CheckForOverflowUnderflow="false"
(normalmente, ho attivato il controllo di overflow) e lo ho distribuito su un dispositivo. Il monitoraggio di Nagios mostra che il carico medio della CPU è rimasto al 17%.
Questo significa che il colpo di performance trovato nell'esempio inventato sopra è totalmente irrilevante per la nostra applicazione.