Advertisement
Wyrd

Lock performance

Feb 22nd, 2012
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. #include <tchar.h>
  2. #include <iostream>
  3.  
  4. #include <Windows.h>
  5.  
  6. #include <boost/thread.hpp>
  7.  
  8. class CTimer
  9. {
  10.     static double TicksPerSecond()
  11.     {
  12.         LARGE_INTEGER nFreq;
  13.  
  14.         ::QueryPerformanceFrequency( &nFreq );
  15.  
  16.         return nFreq.QuadPart / 1000000.0;
  17.     }
  18.  
  19. public:
  20.  
  21.     CTimer()
  22.     {
  23.         reset();
  24.     }
  25.  
  26.     //! Returns current (system) time in microseconds.
  27.     double tick() const
  28.     {
  29.         LARGE_INTEGER nCounter;
  30.  
  31.         ::QueryPerformanceCounter( &nCounter );
  32.  
  33.         return nCounter.QuadPart / m_sdTicksPerSecond;
  34.     }
  35.  
  36.     //! Resets timer and returns current (system) time in microseconds.
  37.     double reset()
  38.     {
  39.         m_dLast = tick();
  40.         return m_dLast;
  41.     }
  42.  
  43.     //! Returns elapsed time in microseconds since last reset(), then resets timer.
  44.     double lap()
  45.     {
  46.         double t = m_dLast;
  47.         m_dLast  = tick();
  48.         return m_dLast - t;
  49.     }
  50.  
  51. private:
  52.  
  53.     double        m_dLast;
  54.     static double m_sdTicksPerSecond;
  55. };
  56.  
  57. double CTimer::m_sdTicksPerSecond = CTimer::TicksPerSecond();
  58.  
  59. #define N 100000000
  60. #define K 10
  61.  
  62. volatile long n = 0;
  63.  
  64. void TP_NL()
  65. {
  66.     __asm mov eax, 1;
  67.     for( size_t i = 0; i < N; ++i )
  68.     {
  69.         __asm xadd dword ptr[n], eax;
  70.     }
  71. }
  72.  
  73. void TP_L()
  74. {
  75.     __asm mov eax, 1;
  76.     for( size_t i = 0; i < N; ++i )
  77.     {
  78.         __asm lock xadd dword ptr[n], eax;
  79.     }
  80. }
  81.  
  82. int _tmain( int argc, _TCHAR* argv[] )
  83. {
  84.     //SetProcessAffinityMask( GetCurrentProcess(), 1 );
  85.     SetThreadAffinityMask( GetCurrentThread(), 1 );
  86.  
  87.     auto DoTest =
  88.         []( void (*pFunc)() )
  89.         {
  90.             std::vector< boost::thread > oVec;
  91.             oVec.reserve( K );
  92.  
  93.             CTimer oTimer;
  94.  
  95.             for( size_t i = 0; i < K; ++i )
  96.             {
  97.                 oVec.push_back( boost::thread( pFunc ) );
  98.             }
  99.  
  100.             for( size_t i = 0; i < K; ++i )
  101.             {
  102.                 oVec[i].join();
  103.             }
  104.  
  105.             double d = oTimer.lap() * 1e3 / double( N ) / double( K );
  106.  
  107.             std::cout << "const of one operation: " << d << " ns." << std::endl;
  108.         };
  109.  
  110.     DoTest( &TP_NL );
  111.     DoTest( &TP_L );
  112.  
  113.     return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement