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