Singletone (C++)
Добавил: pshenichny
Автор: pshenichny
#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;
}