Stavo cercando di risolvere i problem #14 from Project Euler, e aveva scritto il seguente C# ...Perché la modifica di int per accelerare più a lungo l'esecuzione?
int maxColl = 0;
int maxLen = 0;
for (int i = 2; i < 1000000; i++) {
int coll = i;
int len = 1;
while (coll != 1) {
if (coll % 2 == 0) {
coll = coll/2;
} else {
coll = 3 * coll + 1;
}
len++;
}
if (len > maxLen) {
maxLen = len;
maxColl = i;
}
}
Il problema era che, solo corse e corse senza sembrare di fermarsi.
Dopo aver cercato la soluzione di altre persone al problema, ne ho visto uno molto simile, tranne per il fatto che aveva usato molto tempo anziché int. Non ho visto perché questo dovrebbe essere necessario, dal momento che tutti i numeri coinvolti in questo problema sono compresi nell'intervallo di un int, ma l'ho provato comunque.
Cambiando int a long il codice viene eseguito in poco più di 2 secondi.
Chiunque può spiegarmi questo?
Cambiare semplicemente da int a lungo non dovrebbe rendere questa drammatica differenza. Ho il sospetto che tu abbia un trabocco che impedisce il ciclo di rottura. guardalo nel debugger e vedi se non riesci a capire se c'è un overflow da qualche parte. –
Normalmente Int64 è più lento di Int32. Forse hai qui una gestione di overflow che causa che Int32 è più lento. – Ben
@Ben normalmente è altrettanto veloce, tranne per la divisione e alcune operazioni complesse. Su alcuni sistemi che operano su valori a 32 bit sono ancora più lenti perché è necessario firmare/zero l'estensione e mascherare per convertire in valori a 64 bit –