Próbowałem dowiedzieć się, czy pętla for była szybsza od pętli foreach i używała klas System.Diagnostics do wykonania zadania. Podczas wykonywania testu zauważyłem, że kiedykolwiek pierwsza pętla, którą stawiam, zawsze wykonuje wolniej niż ostatnia. Czy ktoś może mi powiedzieć, dlaczego tak się dzieje? Moje kodu jest poniżej:Dlaczego druga pętla for zawsze działa szybciej niż pierwsza?
using System;
using System.Diagnostics;
namespace cool {
class Program {
static void Main(string[] args) {
int[] x = new int[] { 3, 6, 9, 12 };
int[] y = new int[] { 3, 6, 9, 12 };
DateTime startTime = DateTime.Now;
for (int i = 0; i < 4; i++) {
Console.WriteLine(x[i]);
}
TimeSpan elapsedTime = DateTime.Now - startTime;
DateTime startTime2 = DateTime.Now;
foreach (var item in y) {
Console.WriteLine(item);
}
TimeSpan elapsedTime2 = DateTime.Now - startTime2;
Console.WriteLine("\nSummary");
Console.WriteLine("--------------------------\n");
Console.WriteLine("for:\t{0}\nforeach:\t{1}", elapsedTime, elapsedTime2);
Console.ReadKey();
}
}
}
Oto wynik:
for: 00:00:00.0175781
foreach: 00:00:00.0009766
Wystarczy krótka notatka: Podczas rozrządu coś do określenia względnych czasów wykonania, nie robić nic wyjściowego (WriteLine()) wewnątrz pętli. Czas potrzebny na zrobienie WriteLine() jest prawdopodobnie tysiące (do milionów) razy dłuższy niż to, co próbujesz testować, więc tracisz poczucie dokładności. Ponadto będziesz potrzebował więcej niż czterech (4) iteracji, aby były znaczące. Wypróbuj tysiące (lub nawet miliony). –
Jest tylko jedna prawdziwa odpowiedź na twoje pytanie: twój benchmark jest poważnie wadliwy. Inne wspomniane punkty są prawdziwe, ale nie dlatego otrzymujesz ten wynik. –
Co to jest, jeśli najpierw wykonasz pętlę foreach? –