//Test dla i++ Stopwatch s1 = new Stopwatch(); s1.Start(); for (int i = 0; i < lim; i++) { //code } s1.Stop(); Console.WriteLine("Time for i++: {0} ms", s1.ElapsedMilliseconds);
//Test dla i-- Stopwatch s2 = new Stopwatch(); s2.Start(); for (int i = lim - 1; i >= 0; i--) { //code } s2.Stop(); Console.WriteLine("Time for i--: {0} ms", s2.ElapsedMilliseconds);Dodałem możliwość powtarzania tego testu. Obliczenia powtarzałem z 10 razy, aby wyniki były bardziej wiarygodne.
int lim = int.MaxValue; //2147483647 long time1 =0, time2=0; List<long> gList1 = new List<long>(); List<long> gList2 = new List<long>(); for (int i = 0; i < 10; i++) //powtarza 10 razy { TestFor(lim, ref time1, ref time2); gList1.Add(time1); gList2.Add(time2); } var avgPlus = gList1.Average(); var avgMinus = gList2.Average(); var maxPlus = gList1.Max(); var maxMinus = gList2.Max(); var minPlus = gList1.Min(); var minMinus = gList2.Min(); Console.WriteLine(new { avgPlus, maxPlus, minPlus }); // wyświetla wyniki dla i++ Console.WriteLine(new { avgMinus, maxMinus, minMinus }); // wyświetla wyniki dla i--
Jednostki w przedstawionych wynikach są liczone w milisekundach.
1) Brak operacji w pętli.
{
avgPlus = 5084,
maxPlus = 5178,
minPlus = 4998
}
{
avgMinus = 6747,
maxMinus = 6828,
minMinus = 6677
}
Operacja i++ jest szybsza. Czasy dla operacji i++ są około 1,7 sekundy mniejsze niż dla operacji i--.
2) Prosta operacja zawarta w pętli.
int iter = 0; iter++;
{
avgPlus = 6368,
maxPlus = 6494,
minPlus = 6319
}
{
avgMinus = 5472,
maxMinus = 5600,
minMinus = 5446
}
Wyniki są odwrotne do wyników z poprzedniego testu. W tym przypadku operacja i-- jest szybsza. Ciekawe jest, że wyniki dla prostej operacji w pętli są lepsze niż dla pętli bez operacji.
3) Operacja na stringu.
"ab".Replace('a','b');
{
avgPlus = 127846,3,
maxPlus = 136981,
minPlus = 125358
}
{
avgMinus = 125099,2,
maxMinus = 131357,
minMinus = 123913
}
Badanie potwierdza wnioski z punktu 2, że operacja i-- jest szybsza od i++.
4) Skoro była inkrementacja w pętli to sprawdziłem dekrementacje.
int iter = 0; iter--;
{
avgPlus = 6237,4,
maxPlus = 6260,
minPlus = 6225
}
{
avgMinus = 5337,6,
maxMinus = 5383,
minMinus = 5298
}
Badanie potwierdza wniosek z punktu 2. Operacja dekrementacji jest szybka od operacji inkrementacji.
5) W ciele pętli jest tworzenie obiektu.
{
avgPlus = 52622,
maxPlus = 54548,
minPlus = 51284
}
{
avgMinus = 51557,1,
maxMinus = 55958,
minMinus = 50173
}
Ostatnie badanie potwierdza, że operacja dekrementacji jest szybsza od operacji inkrementacji.
Jak na razie nie wiem dlaczego tak się dzieje. Gdyby ktoś wiedział dlaczego operacja dekrementacji jest szybsza, to proszę o kontakt.