Witam,
Tak sobie sprawdziłem wydajność standardowych semaforów binarnych w windows... i trochę się zaskoczyłem:
...
for (int i = 0; i < NR_ITER; ) {
WaitForSingleObject(mutex, INFINITE);
i++;
ReleaseMutex(mutex);
}
...
Pętla bardzo prosta, tylko jeden wątek więc nie wystąpi nigdy blokowanie (chciałem tylko sprawdzić wydajność opuszczania i podnoszenia semafora). I oto jakie wyniki uzyskałem:
E:\projects\MutexTest>g++ MutexTest.cpp -o MutexTest.exe -O3 && MutexTest.exe
1000000 iter / 1.029 sec = 971817.298 iter/sec = 1029.000 nanosec/iter
Ponad 1 mikrosekunda na jeden obieg pętli... Cała wieczność :) Wcześniej wydawało mi się, że w środku kryje się pare instrukcji asemblerowych (w stylu XCHG) tak, że całość wykona się bardzo szybko, ale jest inaczej. Pewnie dlatego, że z tych semaforów korzysta się przy używaniu wolniejszych podzespołów systemu operacyjnego (np pliki, zasoby sieciowe), a nie są one przydatne przy tworzeniu wydajnego oprogramowania korzystającego z wielowątkowości.
Zna ktoś może jakieś szybsze funkcje/biblioteki do obsługi semaforów?