Войти
|
Присоединиться
CodePaste.ru
# My code sucks but I don't give a fuck
CodePaste.ru # My code sucks but I don't give a fuck
Главная
Все исходники
Добавить
md5
base64
url
diff
Singletone
(C++)
Добавил:
pshenichny
Автор:
pshenichny
text/plain
text/html
source
Old rev.:
#include <stdio.h> #include <windows.h> class Simple { public: Simple () { a = 5; } ~Simple () { a = 0; } int Get () const { return a; } private: int a; }; Simple simple; // Небезопасный синглтон __forceinline Simple & Instance () { static Simple one; return one; } CRITICAL_SECTION critical_section; // Безопасный синглтон __forceinline Simple & SafeInstance () { EnterCriticalSection ( & critical_section ); static Simple one; LeaveCriticalSection ( & critical_section ); return one; } int main () { if ( SetPriorityClass ( GetCurrentProcess (), REALTIME_PRIORITY_CLASS ) == 0 ) { printf ( "SetPriority failed.\n"); } InitializeCriticalSection ( & critical_section ); const int LOOP_COUNT = 20000000; LARGE_INTEGER t1, t2, t3, t4, t_per_sec; volatile int k; // обычный доступ QueryPerformanceCounter ( & t1 ); for ( int i = 0; i < LOOP_COUNT; ++i ) { k = simple.Get(); k = simple.Get(); k = simple.Get(); k = simple.Get(); } // доступ через синглтон QueryPerformanceCounter ( & t2 ); for ( int i = 0; i < LOOP_COUNT; ++i ) { k = Instance().Get(); k = Instance().Get(); k = Instance().Get(); k = Instance().Get(); } // доступ через безопасный синглтон QueryPerformanceCounter ( & t3 ); for ( int i = 0; i < LOOP_COUNT; ++i ) { k = SafeInstance().Get(); k = SafeInstance().Get(); k = SafeInstance().Get(); k = SafeInstance().Get(); } QueryPerformanceCounter ( & t4 ); QueryPerformanceFrequency ( & t_per_sec ); DeleteCriticalSection ( & critical_section ); printf ( " simple.Get() = %I64u msec\n", 1000 * (t2.QuadPart - t1.QuadPart) / t_per_sec.QuadPart ); printf ( " Instance().Get() = %I64u msec\n", 1000 * (t3.QuadPart - t2.QuadPart) / t_per_sec.QuadPart ); printf ( "SafeInstance().Get() = %I64u msec\n", 1000 * (t4.QuadPart - t3.QuadPart) / t_per_sec.QuadPart ); return 0; }