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;
}