2012-02-06 8 views
5

Powiedz, że mam tablicę bajtów zawierającą 100 000 bajtów. Chcę przekonwertować każdy bajt na jego własną reprezentację tekstową. Na przykład:Czy istnieje szybszy sposób na przeglądanie tysięcy elementów?

byte[] b = new byte[55000]; 

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

Powyższy kod zajmuje około 35 sekund, aby zakończyć, czy jest jakiś sposób, aby zmniejszyć to do około 5 sekund?

+3

czy próbowałeś użyć czegoś innego niż 'Console.WriteLine()' lub upuściłeś go całkowicie, a następnie testując wymaganie czasu? Nawet jeśli jest to po prostu użycie konstruktora stringów, a następnie wyprowadzenie łańcucha stringbuilder po zakończeniu wszystkich pętli, powinno to pomóc. –

+0

Użyj wielowątkowości – Maheep

Odpowiedz

4

Jak wspomniano w moim komentarzu, sugerowałbym usunięcie metody Console.WriteLine(). Sugerowałbym także, aby unikać tego w pętlach. Zwykle, jeśli chcesz zobaczyć, co jest przetwarzane, możesz użyć albo Debug.WriteLine() (MSDN) lub ustawić punkt przerwania (nawet warunkowy punkt przerwania, jeśli masz konkretny przypadek, który nie działa poprawnie). Jeśli potrzebujesz zwrócić dane, to ponownie sugerowałbym użycie konstruktora ciągów znaków:

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

Używając twoich sugestii, mam to do pracy w ** pod ** żądane 5 sekund - niesamowita robota, dziękuję, Gary. –

3

jedna rzecz ja lubię to napisać Parallel.For Loop ze może zrobić coś szybciej niż teraz ..

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

Należy pamiętać, że kolejność zostanie zmieniona przy użyciu metod równoległych. '.AsOrdered()' może być w stanie pomóc, jednak pociąga za sobą obniżenie wydajności. –

+0

W tym przypadku kolejność jest bardzo ważna dla tego, co robię. Console.WriteLine() zostanie zastąpiona przez inną funkcję. –

-1

Profil swój kod, aby zobaczyć, jaka metoda bierze najwięcej czasu. Skoncentruj swoje wysiłki na optymalizacji na tej metodzie.

Powiązane problemy