| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 | 
							- /////////////////////////////////////////////////////////////////////////////
 
- // Name:        tests/benchmarks/strings.cpp
 
- // Purpose:     String-related benchmarks
 
- // Author:      Vadim Zeitlin
 
- // Created:     2008-07-19
 
- // Copyright:   (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
 
- // Licence:     wxWindows licence
 
- /////////////////////////////////////////////////////////////////////////////
 
- #include "bench.h"
 
- #include "wx/tls.h"
 
- #if defined(__UNIX__)
 
-     #define HAVE_PTHREAD
 
-     #include <pthread.h>
 
- #elif defined(__WIN32__)
 
-     #define HAVE_WIN32_THREAD
 
-     #include "wx/msw/wrapwin.h"
 
- #endif
 
- #if wxCHECK_GCC_VERSION(3, 3)
 
-     #define HAVE_COMPILER_THREAD
 
-     #define wxTHREAD_SPECIFIC __thread
 
- #elif wxCHECK_VISUALC_VERSION(7)
 
-     #define HAVE_COMPILER_THREAD
 
-     #define wxTHREAD_SPECIFIC __declspec(thread)
 
- #endif
 
- // uncomment this to also test Boost version (you will also need to link with
 
- // libboost_threads)
 
- //#define HAVE_BOOST_THREAD
 
- #ifdef HAVE_BOOST_THREAD
 
-     #include <boost/thread/tss.hpp>
 
- #endif
 
- static const int NUM_ITER = 1000;
 
- // this is just a baseline
 
- BENCHMARK_FUNC(DummyTLS)
 
- {
 
-     static int s_global = 0;
 
-     for ( int n = 0; n < NUM_ITER; n++ )
 
-     {
 
-         if ( n % 2 )
 
-             s_global = 0;
 
-         else
 
-             s_global = n;
 
-     }
 
-     return !s_global;
 
- }
 
- #ifdef HAVE_COMPILER_THREAD
 
- BENCHMARK_FUNC(CompilerTLS)
 
- {
 
-     static wxTHREAD_SPECIFIC int s_global = 0;
 
-     for ( int n = 0; n < NUM_ITER; n++ )
 
-     {
 
-         if ( n % 2 )
 
-             s_global = 0;
 
-         else
 
-             s_global = n;
 
-     }
 
-     return !s_global;
 
- }
 
- #endif // HAVE_COMPILER_THREAD
 
- #ifdef HAVE_PTHREAD
 
- class PthreadKey
 
- {
 
- public:
 
-     PthreadKey()
 
-     {
 
-         pthread_key_create(&m_key, NULL);
 
-     }
 
-     ~PthreadKey()
 
-     {
 
-         pthread_key_delete(m_key);
 
-     }
 
-     operator pthread_key_t() const { return m_key; }
 
- private:
 
-     pthread_key_t m_key;
 
-     DECLARE_NO_COPY_CLASS(PthreadKey)
 
- };
 
- BENCHMARK_FUNC(PosixTLS)
 
- {
 
-     static PthreadKey s_key;
 
-     for ( int n = 0; n < NUM_ITER; n++ )
 
-     {
 
-         if ( n % 2 )
 
-             pthread_setspecific(s_key, 0);
 
-         else
 
-             pthread_setspecific(s_key, &n);
 
-     }
 
-     return !pthread_getspecific(s_key);
 
- }
 
- #endif // HAVE_PTHREAD
 
- #ifdef HAVE_WIN32_THREAD
 
- class TlsSlot
 
- {
 
- public:
 
-     TlsSlot()
 
-     {
 
-         m_slot = ::TlsAlloc();
 
-     }
 
-     ~TlsSlot()
 
-     {
 
-         ::TlsFree(m_slot);
 
-     }
 
-     operator DWORD() const { return m_slot; }
 
- private:
 
-     DWORD m_slot;
 
-     DECLARE_NO_COPY_CLASS(TlsSlot)
 
- };
 
- BENCHMARK_FUNC(Win32TLS)
 
- {
 
-     static TlsSlot s_slot;
 
-     for ( int n = 0; n < NUM_ITER; n++ )
 
-     {
 
-         if ( n % 2 )
 
-             ::TlsSetValue(s_slot, 0);
 
-         else
 
-             ::TlsSetValue(s_slot, &n);
 
-     }
 
-     return !::TlsGetValue(s_slot);
 
- }
 
- #endif // HAVE_WIN32_THREAD
 
- #ifdef HAVE_BOOST_THREAD
 
- BENCHMARK_FUNC(BoostTLS)
 
- {
 
-     static boost::thread_specific_ptr<int> s_ptr;
 
-     if ( !s_ptr.get() )
 
-         s_ptr.reset(new int(0));
 
-     for ( int n = 0; n < NUM_ITER; n++ )
 
-     {
 
-         if ( n % 2 )
 
-             *s_ptr = 0;
 
-         else
 
-             *s_ptr = n;
 
-     }
 
-     return !*s_ptr;
 
- }
 
- #endif // HAVE_BOOST_THREAD
 
- BENCHMARK_FUNC(wxTLS)
 
- {
 
-     static wxTLS_TYPE(int) s_globalVar;
 
-     #define s_global wxTLS_VALUE(s_globalVar)
 
-     for ( int n = 0; n < NUM_ITER; n++ )
 
-     {
 
-         if ( n % 2 )
 
-             s_global = 0;
 
-         else
 
-             s_global = n;
 
-     }
 
-     return !s_global;
 
- }
 
 
  |