Blame libs/chrono/perf/store_now_in_vector.cpp

Packit 58578d
//  Copyright 2011 Vicente J. Botet Escriba
Packit 58578d
//  Copyright (c) Microsoft Corporation 2014
Packit 58578d
Packit 58578d
//  Distributed under the Boost Software License, Version 1.0.
Packit 58578d
//  See http://www.boost.org/LICENSE_1_0.txt
Packit 58578d
Packit 58578d
#include <boost/chrono/chrono.hpp>
Packit 58578d
#include <boost/chrono/chrono_io.hpp>
Packit 58578d
#include <libs/chrono/example/timer.hpp>
Packit 58578d
#include <boost/chrono/process_cpu_clocks.hpp>
Packit 58578d
#include <vector>
Packit 58578d
Packit 58578d
//#define BOOST_CHRONO_HAS_TIMES_AND_CLOCK
Packit 58578d
Packit 58578d
#ifdef BOOST_CHRONO_HAS_TIMES_AND_CLOCK
Packit 58578d
#include <sys/time.h> //for gettimeofday and timeval
Packit 58578d
#include <sys/times.h> //for times
Packit 58578d
#include <unistd.h>
Packit 58578d
#endif
Packit 58578d
Packit 58578d
Packit 58578d
static const std::size_t size = 1000000;
Packit 58578d
Packit 58578d
typedef boost::chrono::timer<boost::chrono::high_resolution_clock> Stopwatch;
Packit 58578d
Packit 58578d
template <typename Clock>
Packit 58578d
void perf_constant(std::vector<typename Clock::time_point>& vec)
Packit 58578d
{
Packit 58578d
  for (int i=size-1; i>=0; --i)
Packit 58578d
  {
Packit 58578d
    vec[i]=typename Clock::time_point();
Packit 58578d
  }
Packit 58578d
}
Packit 58578d
Packit 58578d
template <typename Clock>
Packit 58578d
void perf(std::vector<typename Clock::time_point>& vec)
Packit 58578d
{
Packit 58578d
  for (int i=size-1; i>=0; --i)
Packit 58578d
  {
Packit 58578d
    vec[i]=Clock::now();
Packit 58578d
  }
Packit 58578d
}
Packit 58578d
Packit 58578d
template <typename Clock>
Packit 58578d
void test()
Packit 58578d
{
Packit 58578d
  std::vector<typename Clock::time_point> vec(size);
Packit 58578d
  Stopwatch sw1;
Packit 58578d
  perf_constant<Clock>(vec);
Packit 58578d
  Stopwatch::duration t1 = sw1.elapsed();
Packit 58578d
  Stopwatch sw2;
Packit 58578d
  perf<Clock>(vec);
Packit 58578d
  Stopwatch::duration t2 = sw2.elapsed();
Packit 58578d
  std::cout <<" "<< (t2-t1) << std::endl;
Packit 58578d
  //std::cout <<" "<< ((t2-t1)/size) << std::endl;
Packit 58578d
  std::size_t cnt=0;
Packit 58578d
  for (int i=size-1; i>0; --i)
Packit 58578d
  {
Packit 58578d
    if (vec[i]!=vec[i-1]) ++cnt;
Packit 58578d
  }
Packit 58578d
  std::cout <<"changes: "<< cnt << std::endl;
Packit 58578d
Packit 58578d
}
Packit 58578d
Packit 58578d
Packit 58578d
Packit 58578d
Packit 58578d
Packit 58578d
#ifdef BOOST_CHRONO_HAS_TIMES_AND_CLOCK
Packit 58578d
void perf2(std::vector<clock_t>& vec)
Packit 58578d
{
Packit 58578d
  Stopwatch sw;
Packit 58578d
  for (int i=size-1; i>=0; --i)
Packit 58578d
  {
Packit 58578d
    tms tm;
Packit 58578d
    vec[i]=::times(&tm;;
Packit 58578d
  }
Packit 58578d
  std::cout << sw.elapsed() << std::endl;
Packit 58578d
}
Packit 58578d
Packit 58578d
void perf3(std::vector<clock_t>& vec)
Packit 58578d
{
Packit 58578d
  Stopwatch sw;
Packit 58578d
  for (int i=size-1; i>=0; --i)
Packit 58578d
  {
Packit 58578d
    vec[i]=::clock();
Packit 58578d
  }
Packit 58578d
  std::cout << sw.elapsed() << std::endl;
Packit 58578d
}
Packit 58578d
Packit 58578d
void test2()
Packit 58578d
{
Packit 58578d
  std::vector<clock_t> vec(size);
Packit 58578d
  perf2(vec);
Packit 58578d
  std::size_t cnt=0;
Packit 58578d
  for (int i=10; i>0; --i)
Packit 58578d
  {
Packit 58578d
    if (vec[i]!=vec[i-1]) ++cnt;
Packit 58578d
    std::cout << vec[i] << " " ;
Packit 58578d
  }
Packit 58578d
  std::cout<< std::endl;
Packit 58578d
  std::cout <<"changes: "<< cnt << std::endl;
Packit 58578d
}
Packit 58578d
Packit 58578d
void test3()
Packit 58578d
{
Packit 58578d
  std::vector<clock_t> vec(size);
Packit 58578d
  perf3(vec);
Packit 58578d
  std::size_t cnt=0;
Packit 58578d
  for (int i=10; i>0; --i)
Packit 58578d
  {
Packit 58578d
    if (vec[i]!=vec[i-1]) ++cnt;
Packit 58578d
    std::cout << vec[i] << " " ;
Packit 58578d
  }
Packit 58578d
  std::cout<< std::endl;
Packit 58578d
  std::cout <<"changes: "<< cnt << std::endl;
Packit 58578d
}
Packit 58578d
Packit 58578d
#endif
Packit 58578d
Packit 58578d
int main() {
Packit 58578d
Packit 58578d
  std::cout << "system_clock ";
Packit 58578d
  test<boost::chrono::system_clock>();
Packit 58578d
#ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
Packit 58578d
  std::cout << "steady_clock " ;
Packit 58578d
  test<boost::chrono::steady_clock>();
Packit 58578d
#endif
Packit 58578d
  std::cout << "high_resolution_clock " ;
Packit 58578d
  test<boost::chrono::high_resolution_clock>();
Packit 58578d
Packit 58578d
#if defined(BOOST_CHRONO_HAS_PROCESS_CLOCKS)
Packit 58578d
  std::cout << "process_real_cpu_clock ";
Packit 58578d
  test<boost::chrono::process_real_cpu_clock>();
Packit 58578d
#if ! BOOST_OS_WINDOWS || BOOST_PLAT_WINDOWS_DESKTOP
Packit 58578d
  std::cout << "process_user_cpu_clock ";
Packit 58578d
  test<boost::chrono::process_user_cpu_clock>();
Packit 58578d
  std::cout << "process_system_cpu_clock " ;
Packit 58578d
  test<boost::chrono::process_system_cpu_clock>();
Packit 58578d
  std::cout << "process_cpu_clock " ;
Packit 58578d
  test<boost::chrono::process_cpu_clock>();
Packit 58578d
#endif
Packit 58578d
#endif
Packit 58578d
  std::cout << "system_clock ";
Packit 58578d
  test<boost::chrono::system_clock>();
Packit 58578d
#if 0
Packit 58578d
  std::cout << "times ";
Packit 58578d
  test2();
Packit 58578d
  std::cout << "clock ";
Packit 58578d
  test3();
Packit 58578d
#endif
Packit 58578d
  return 1;
Packit 58578d
}