2014-06-19 18 views
19

dokumentacji MSDN dla ManualResetEventSlim stanachManualResetEventSlim zalecany czas oczekiwania

Można użyć tej klasy dla lepszej wydajności niż ManualResetEvent gdy oczekuje się czas oczekiwania jest bardzo krótki.

Jak długo jest "bardzo krótki"? W którym momencie korzyść z używania obiektu jądra o wartości ManualResetEvent przeważy nad narzutem jego utworzenia?

+0

Dla mnie "bardzo krótki" jest całkiem bez znaczenia. Moją zasadą jest to, że jeśli spodziewam się, że zdarzenie zostanie ustawione przez większość czasu (tzn. Nie oczekuję czekania), użyję 'ManualResetEventSlim'. W przeciwnym razie użyję 'ManualResetEvent'. Jeśli piszesz aplikację wrażliwą na wydajność, powinieneś przetestować swój kod, aby stwierdzić, czy są jakieś różnice. Jeśli nie liczymy mikrosekund, to prawdopodobnie strata czasu, aby się martwić, który z nich jest szybszy. –

+2

"Bardzo krótki" w tym kontekście oznacza dziesiątki do setek mikrosekund. Szczupła wersja wiruje z oczekiwaniem, że drugi wątek zwolni blokadę w czasie krótszym niż kilka przełączników kontekstu. – doug65536

Odpowiedz

10

To co znalazłem i chciałbym dla kogoś innego, aby potwierdzić to, ale to co znalazłem podczas czytania Reference Source for ManualResetEventSlim

ManualResetEventSlim
Jest próbą prostu spać i wydajność na podstawie liczby procesorów i robienie ekstremalnie krótkich snu - 1ms lub 0ms w zależności od bieżącego indeksu spinów. Jeśli to nadal nie wystarczy, nastąpi powrót do używania Monitor.Wait przy użyciu nowej zaktualizowanej wersji limitu czasu, który został pierwotnie przekazany.

Przekazanie w 0 dla Thread.Sleep zwalnia swój przedział czasowy.

ManualResetEvent
Wykorzystuje WaitHandle i wywołuje metody rodzimych obsłużyć czeka przez określony czas. Niestety nie jestem w stanie zobaczyć, co robi.

Mój wniosek
"Bardzo krótki" oznacza tylko kilka milisekund.

EDIT: Właśnie znalazłem te, które mają dużo informacji:

0

Skala od pamięci podręcznej procesora do pamięci RAM i do jądra jest w przybliżeniu logarytmiczna. Załóżmy, że możesz wykonać 400 cykli przy użyciu pamięci podręcznej procesora lub 20 cykli procesora za pomocą odczytu/zapisu RAM lub 1 operacji jądra. Liczby będą zależeć od sprzętu, to tylko szacunek.

Jeśli uważasz, że maksymalny czas oczekiwania będzie mniejszy niż 6-15 ns (~ 20-50 cykli procesora @ 3GHz) niż mały czas oczekiwania.

Powiązane problemy