2012-02-06 12 views
5

Digamos que tengo una matriz de bytes con 100.000 bytes. Quiero convertir cada byte en su representación textual de sí mismo. Por ejemplo:¿Hay una forma más rápida de recorrer miles de elementos?

byte[] b = new byte[55000]; 

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

El código anterior tarda alrededor de 35 segundos en completarse, ¿hay alguna manera de reducirlo a alrededor de 5 segundos?

+3

¿Ha intentado utilizar algo distinto de 'Console.WriteLine()' o dejarlo caer por completo y luego probar el requisito de tiempo? Incluso si solo está usando un generador de cadenas y luego sacando la cadena de stringbuilder después de que todos los bucles se hayan completado, debería ser de ayuda. –

+0

Usar multiprocesamiento – Maheep

Respuesta

4

Como se menciona en mi comentario, le sugiero que elimine el método Console.WriteLine(). También sugeriría que se evite en bucles. Normalmente, si desea ver qué se está procesando, debe usar Debug.WriteLine() (MSDN) o establecer un punto de interrupción (incluso un punto de corte condicional si tiene un caso específico que no funciona correctamente). Si tiene que devolver los datos a continuación, de nuevo, me gustaría sugerir el uso de un generador de cadenas:

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 sus sugerencias, hice que esto funcione ** en ** los 5 segundos solicitados - trabajo increíble, gracias, Gary. –

3

una cosa que es aficionado a Escribir un Parallel.For Loop con lo que podría hacer más rápido que en este 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 a tener en cuenta es que el orden se cambiará cuando se usen métodos paralelos. '.AsOrdered()' puede ser capaz de ayudar, pero incurrirá en una penalización de rendimiento. –

+0

En este caso, el orden es muy importante para lo que estoy haciendo. Console.WriteLine() va a ser reemplazado por alguna otra función. –

-1

perfil de su código para ver qué método se está llevando la mayor parte del tiempo. Enfoca tus esfuerzos de optimización en ese método.

Cuestiones relacionadas