Ile trwa Sleep(1ms)?
Witam,
Ile trwa "System.Threading.Thread.Sleep(1);"?
Ostatnio przeprowadziłem test w którym chciałem sprawdzić możliwości Windows jako systemu czasu rzeczywistego, czyli postanowiłem sprawdzić ile zajmie uśpienie systemu na 1 ms.
Test wyglądał następująco:
//wlasciwy test
MinMaxAvg minmaxavg = new MinMaxAvg();
for (int test = 0; test < 10; test++)
{
for (int i = 0; i < test; i++)
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(ThreadProc));
MinMaxAvg minmaxavg_local = new MinMaxAvg();
for (int i = 0; i < 1000; i++)
{
System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
System.Threading.Thread.Sleep(1);
sw.Stop();
double time_in_milis = (double)sw.Elapsed.Ticks / (double)TimeSpan.TicksPerMillisecond;
minmaxavg.AddValue(time_in_milis);
minmaxavg_local.AddValue(time_in_milis);
}
Console.WriteLine(String.Format("test #{0}: {1}",test,minmaxavg.ToString()));
}
Console.WriteLine("Summary: "+minmaxavg.ToString());
Gdzie MinMaxAvg to klasa wyznaczająca minimum, maksimum i średnią, a dodatkowe wątki uruchamiane w puli, to ciężka praca do wykonania w postaci:
long val = 0; for (int i = 0; i < 200000000 ; i++)val += i;
Cały kod dostępny tutaj: http://www.mm.pl/~maciekz/download/sleep1test.zip
Wyniki:
Procesor: Liczba procesorów: 1
Liczba rdzeni: 2
Typ: Intel64 Family 6 Model 23 Stepping 10
Taktowanie: 2534Mhz
test #0: Minimum=0,1977; Average=0,9902776; Maximum=1,4756;
test #1: Minimum=0,1977; Average=0,991854700000001; Maximum=1,6275;
test #2: Minimum=0,1977; Average=0,993487600000001; Maximum=2,7511;
test #3: Minimum=0,0628; Average=1,041576725; Maximum=191,6798;
test #4: Minimum=0,0546; Average=1,07218284; Maximum=197,0183;
test #5: Minimum=0,0546; Average=1,05993491666667; Maximum=197,0183;
test #6: Minimum=0,0546; Average=1,05101061428572; Maximum=197,0183;
test #7: Minimum=0,0546; Average=1,04429911250001; Maximum=197,0183;
test #8: Minimum=0,0546; Average=1,03930382222223; Maximum=197,0183;
test #9: Minimum=0,0546; Average=1,03537345000001; Maximum=197,0183;
Summary: Minimum=0,0546; Average=1,03537345000001; Maximum=197,0183;
oraz na innym komputerze:
Procesor: Liczba procesorów: 1
Liczba rdzeni: 2
Typ: x86 Family 15 Model 4 Stepping 7
Taktowanie: 2824Mhz
test #0: Minimum=0,3589; Average=1,9402355; Maximum=2,8757;
test #1: Minimum=0,3589; Average=1,9407492; Maximum=2,8757;
test #2: Minimum=0,3589; Average=1,9629437; Maximum=36,8966;
test #3: Minimum=0,3589; Average=1,977586025; Maximum=38,9287;
test #4: Minimum=0,3589; Average=1,9903297; Maximum=38,9287;
test #5: Minimum=0,3589; Average=2,01788521666667; Maximum=42,7573;
test #6: Minimum=0,3589; Average=2,05227467142857; Maximum=46,8195;
test #7: Minimum=0,3589; Average=2,0842682375; Maximum=60,2805;
test #8: Minimum=0,1684; Average=2,11843057777778; Maximum=62,2691;
test #9: Minimum=0,1684; Average=2,13040769; Maximum=62,5606;
Summary: Minimum=0,1684; Average=2,13040769; Maximum=62,5606;
Czyli usypiając nasz wątek na 1 ms, to średnio czekamy 1 - 2 ms, ale może się zdarzyć,
że będziemy spać dużo krócej (nawet 55 mikrosekund)
lub dużo dłużej ponad 200 milisekund (200 razy dłużej niż zamierzaliśmy)
A ile u was trwa Sleep(1)??
A może to efekt złego testu/pomiaru??
Pewnie to kwestia szeregowania procesów w Windows i jak ten zadanie wyszereguje to ponowne zaszeregowanie musi trwać. A może ktoś ma inne lepsze wytłumaczenie?
A może to kwestia platformy .NET??
Robił ktoś podobne testy w innych językach? (c++ , java?)
Pozdrawiam,
Maciek
http://maciej-progtech.blogspot.com/