Listing 8 Extract from counter_cost.cpp


/* /////////////////////////////////////////////////////////////
 * ...
 *
 * Extract from counter_cost.cpp
 *
 * Copyright (C) 2002, Synesis Software Pty Ltd.
 * (Licensed under the Synesis Software Standard Source License:
 *  http://www.synesis.com.au/licenses/ssssl.html)
 *
 * ...
 * ////////////////////////////////////////////////////////// */

#include <stdio.h>

#define _WINSTL_NO_NAMESPACES

#include <winstl.h>
#include <winstl_tick_counter.h>
#include <winstl_multimedia_counter.h>
#include <winstl_highperformance_counter.h>
#include <winstl_systemtime_counter.h>
#include <winstl_threadtimes_counter.h>
#include <winstl_processtimes_counter.h>
#include <winstl_performance_counter.h>
#include <winstl_performance_counter_scope.h>
#include <winstl_performance_counter_init.h>

/* //////////////////////////////////////////////////////////// */

const int   C_ITERATIONS    =   1000000;

/* //////////////////////////////////////////////////////////// */

typedef highperformance_counter application_counter_type;

template<
            ws_typename_param_k C1
        ,   ws_typename_param_k C2
        >
inline ws_typename_type_k C1::interval_type
test_cost(C1 &app_counter, C2 &counter)
{
  for(int i = 0; i < 2; ++i)
  {
    performance_counter_scope<C1>   scope(app_counter);

    for(int j = 0; j < C_ITERATIONS; ++j)
    {
      counter.start();
      counter.stop();
    }
  }

  return app_counter.get_milliseconds();
}

int main(int /* argc */, char* /* argv */[])
{
  performance_counter_init<application_counter_type>  app_counter;

#if defined(_STLSOFT_COMPILER_IS_BORLAND) || \
    defined(_STLSOFT_COMPILER_IS_INTEL) || \
    defined(_STLSOFT_COMPILER_IS_MSVC)    
 #define _counter_test_fmt	"%I64d"
#else
 #define _counter_test_fmt	"%lld"
#endif /* compiler */

#define _test_counter(_x)   \
  do \
  { \
    _x x; \
   \
    printf( #_x ": " _counter_test_fmt "us\n", \
            test_cost(app_counter, x)); \
  } \
  while(0)

  _test_counter(tick_counter);
  _test_counter(multimedia_counter);
  _test_counter(systemtime_counter);
  _test_counter(highperformance_counter);
  _test_counter(threadtimes_counter);
  _test_counter(processtimes_counter);
  _test_counter(performance_counter);

  return 0;
}