Oppure

Loading
01/12/13 13:11
tuttodiMC
L'operatore di casting è sconsigliato perché comporta operazioni costose per la quantità di controlli richiesti e per l'utilizzo di memoria heap aggiuntiva. Di conseguenza la classe Convert, assieme al metodo Int32.Parse(), sono buone alternative in quanto non utilizzano memoria heap. Mi sono abituato subito ad usarli data la loro utilità.

Fharamir ti consiglio di non fare così:

Console.WriteLine("Processo interrotto. Numeri primi trovati: " + Primi.Count());
Console.WriteLine("\nTempo trascorso: " + ts.Seconds + " secondi");


ma ti consiglio di usare i segnaposti offerti gentilmente da WriteLine() così:

Console.WriteLine("Processo interrotto. Numeri primi trovati: {0}", Primi.Count());
Console.WriteLine("Tempo trascorso: {0} secondi",  ts.Seconds);


in modo da gestire meglio la stringa che vai a stampare. Io mi sono trovato più volto ad avere spazi inutili nel mezzo della stringa. Inoltre \n non ti serve a niente se usi Console.WriteLine() dato che a capo ci va da solo.

Altro consiglio. In questa parte di codice:

StreamWriter SW = new StreamWriter("Primi.TXT");
            foreach (UInt64 Pr in Primi)
            {
                SW.WriteLine(Pr);
                Console.WriteLine(Pr);
            }
            SW.Close();


ti conviene utilizzare l'istruzione using in questo modo:

using (StreamWriter SW = new StreamWriter("Primi.TXT")) {
     foreach (UInt64 Pr in Primi)
            {
                SW.WriteLine(Pr);
                Console.WriteLine(Pr);
            }


cosicchè tu non debba poi richiamare il metodo Close() di SW. Se per caso WriteLine() genera un'eccezione, nel tuo codice, non avverrà la chiamata al metodo disposal Close(). Se questo accade più volte potresti esaurire gli handle di file e quindi non potrai più aprire file. Una soluzione è proprio l'istruzione using, ma si può anche usare un blocco try-finally per ottenere lo stesso risultato. Per esempio così:

StreamWriter SW = new StreamWriter("Primi.TXT");
        try {    
            foreach (UInt64 Pr in Primi)
            {
                SW.WriteLine(Pr);
                Console.WriteLine(Pr);
            }
        }
        finally {
            SW.Close();
        }



Infine ti consiglio di utilizzare nomi più dettagliati per le variabili, assieme alle notazioni camelCase e PascalCase.

CIAO!!!
Ultima modifica effettuata da tuttodiMC 01/12/13 13:14
aaa
01/12/13 16:49
pierotofy
Postato originariamente da tuttodiMC:
L'operatore di casting è sconsigliato perché comporta operazioni costose per la quantità di controlli richiesti e per l'utilizzo di memoria heap aggiuntiva. Di conseguenza la classe Convert, assieme al metodo Int32.Parse(), sono buone alternative in quanto non utilizzano memoria heap. Mi sono abituato subito ad usarli data la loro utilità.


No.

Stai facendo confusione tra casting e boxing/unboxing. Boxing/unboxing puo' comportare una perdita di performance quando si fanno conversioni tra tipi non direttamente convertibili (come una stringa e un numero).

using System;
using System.Diagnostics;
					
class Program
{
	public void Main()
    {
		Stopwatch sw = new Stopwatch();

		sw.Start();
		
		int n = 100;
		Int64 m;
		for (int i = 0; i < 100000000; i++){
			m = Convert.ToInt64(Math.Sqrt(n)); 
			//m = (Int64)Math.Sqrt(n);
		}

		sw.Stop();

		Console.WriteLine("Elapsed={0}",sw.Elapsed);
    }
}


m = Convert.ToInt64(Math.Sqrt(n)) : Elapsed=00:00:02.5882971
m = (Int64)Math.Sqrt(n) : Elapsed=00:00:01.3974956

Per questo caso usare l'operatore di casting e' chiaramente piu' veloce.
Il mio blog: piero.dev
01/12/13 18:59
tuttodiMC
OK ma come si fa a capire quando conviene usare uno e quando l'altro?
aaa
02/12/13 8:21
HeDo
Postato originariamente da tuttodiMC:

OK ma come si fa a capire quando conviene usare uno e quando l'altro?


Sinceramente per conversioni "safe" come quella di cui parla Piero ho sempre usato il casting e non ho avuto mai problemi.
Considera che al giorno d'oggi è inutile farsi tante paturnie su qualche ciclo di clock risparmiato, quello che conta è sviluppare in maniera solida e veloce :)
Ad ogni modo ti consiglio di provare il profiler di visual studio oppure ants per renderti conto su cosa è effettivamente più veloce
aaa
02/12/13 19:39
tuttodiMC
Si ma è per imparare a programmare anche su dispositivi con poca memoria e poca velocità.

P.S. OT :ot: Evvai sono diventato un Expert!!!
Ultima modifica effettuata da tuttodiMC 02/12/13 19:40
aaa
09/12/13 12:17
Fharamir
Grazie ragazzi, siete davvero forti :hail: :hail:
aaa