2012-02-06 9 views
5

Dire che ho un array di byte con 100.000 byte in esso. Voglio convertire ogni byte nella sua rappresentazione testuale di se stesso. Ad esempio:Esiste un modo più rapido per eseguire il ciclo di migliaia di elementi?

byte[] b = new byte[55000]; 

for(int i = 0; i < b.Length; i++) 
{ 
Console.WriteLine(ConvertToString(b[i])); 
} 

Il codice di cui sopra impiega circa 35 secondi per essere completato, c'è un modo per ridurlo a circa 5 secondi?

+3

Hai provato a usare qualcosa di diverso da 'Console.WriteLine()' o far cadere del tutto e poi prova il requisito di tempo? Anche se si tratta solo di usare un stringbuilder e quindi di emettere la stringa del stringbuilder dopo che tutti i loop sono stati completati, dovrebbe essere d'aiuto. –

+0

Utilizzare il multithreading – Maheep

risposta

4

Come accennato nel mio commento suggerirei di rimuovere il metodo Console.WriteLine(). Vorrei anche suggerire che sia evitato nei loop. In genere, se si desidera vedere ciò che viene elaborato, utilizzare lo Debug.WriteLine() (MSDN) o impostare un punto di interruzione (anche un punto di interruzione condizionale se si dispone di un caso specifico che non funziona correttamente). Se è necessario restituire i dati poi di nuovo Io suggerirei di usare un costruttore di stringa:

byte[] b = new byte[55000]; 
StringBuilder myStringBuilder = new StringBuilder(); 

for(int i = 0; i < b.Length; i++) 
{ 
    myStringBuilder.AppendLine(ConvertToString(b[i])); 
} 
Console.Write(myStringBuilder.ToString()); 
+0

Usando i tuoi suggerimenti, ho fatto in modo che funzionasse in ** sotto ** i 5 secondi richiesti - lavoro fantastico, grazie, Gary. –

3

una cosa che è appassionato Scrivi una Parallel.For Loop con potrebbe fare cosa più veloce che in questo momento ..

static void Main() 
    { 
     int[] nums = Enumerable.Range(0, 1000000).ToArray(); 
     long total = 0; 

     // Use type parameter to make subtotal a long, not an int 
     Parallel.For<long>(0, nums.Length,() => 0, (j, loop, subtotal) => 
     { 
      subtotal += nums[j]; 
      return subtotal; 
     }, 
      (x) => Interlocked.Add(ref total, x) 
     ); 

     Console.WriteLine("The total is {0}", total); 
     Console.WriteLine("Press any key to exit"); 
     Console.ReadKey(); 
    } 
+0

Una cosa da tenere presente è che l'ordine verrà modificato quando si usano metodi paralleli. '.AsOrdered()' può essere in grado di aiutare, tuttavia, incorre in una penalità di prestazioni. –

+0

In questo caso, l'ordine è molto importante per quello che sto facendo. Console.WriteLine() sarà sostituito da qualche altra funzione. –

-1

Profilo vostro codice per vedere quale metodo sta prendendo più tempo. Concentra i tuoi sforzi di ottimizzazione su quel metodo.

Problemi correlati