#include <stdlib.h>
#include <time.h>
#include <assert.h>
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
static int value = rand();
static int sink  = 0;
vector<string>   foo_names;
vector<string>::iterator iter_names;
vector<vector<clock_t> > used_time;
int test_no = 0;
// ------ with dummy ------
void foo__dummy_start               ()                 { sink += value; }
void foo__dummy_end                 ()                 { sink += value; }
// ------ with body ------
void foo__body__no_args             ()                 { sink += value; }
void foo__body__char_arg_unused     (char)             { sink += value; }
void foo__body__char_arg_used       (char arg)         { sink += arg; }
void foo__body__char_ref_unused     (const char&)      { sink += value; }
void foo__body__char_ref_used       (const char& arg)  { sink += arg; }
void foo__body__short_arg_unused    (short)            { sink += value; }
void foo__body__short_arg_used      (short arg)        { sink += arg; }
void foo__body__short_ref_unused    (const short&)     { sink += value; }
void foo__body__short_ref_used      (const short& arg) { sink += arg; }
void foo__body__int_arg_unused      (int)              { sink += value; }
void foo__body__int_arg_used        (int arg)          { sink += arg; }
void foo__body__int_ref_unused      (const int&)       { sink += value; }
void foo__body__int_ref_used        (const int& arg)   { sink += arg; }
// ------ with no body ------
void foo__no_body__no_args          ()                 {}
void foo__no_body__char_arg_unused  (char)             {}
void foo__no_body__char_ref_unused  (const char&)      {}
void foo__no_body__short_arg_unused (short)            {}
void foo__no_body__short_ref_unused (const short&)     {}
void foo__no_body__int_arg_unused   (int)              {}
void foo__no_body__int_ref_unused   (const int&)       {}
#define MEASURE_IT(x, y) \
  start_time = clock(); \
  assert (start_time != -1); \
  for (int k = 0; k < no_of_repetitions; k++) x;\
  end_time = clock(); \
  assert (end_time != -1); \
  assert (end_time > start_time); \
  if (find (foo_names.begin(), foo_names.end(), #y) == foo_names.end()) \
  { \
    foo_names.push_back (#y); \
    used_time.push_back (vector<clock_t>()); \
  } \
  assert (foo_names.size() == used_time.size()); \
  iter_names = find (foo_names.begin(), foo_names.end(), #y); \
  assert (iter_names != foo_names.end()); \
  used_time[distance (foo_names.begin(), iter_names)].push_back ((end_time - start_time))
#define MEASURE_WITH_ARG(foo, argument) MEASURE_IT (foo(argument), foo)
#define MEASURE_WITH_NO_ARG(foo) MEASURE_IT (foo(), foo)
// ------------
void measure (int no_of_repetitions)
{
const char  ch_val  = 'a';
const short sh_val  = 'a';
const int   int_val = 'a';
clock_t start_time;
clock_t end_time;
vector<clock_t> elapsed_time_vect;
  cerr << "\t---> Test-" << ++test_no << " started" << endl;
  // -------------------------------
  MEASURE_WITH_NO_ARG (foo__dummy_start);
  // -------------------------------
  MEASURE_WITH_NO_ARG (foo__body__no_args);
  MEASURE_WITH_ARG (foo__body__char_arg_unused,  ch_val);
  MEASURE_WITH_ARG (foo__body__char_arg_used,    ch_val);
  MEASURE_WITH_ARG (foo__body__char_ref_unused,  ch_val);
  MEASURE_WITH_ARG (foo__body__char_ref_used,    ch_val);
  MEASURE_WITH_ARG (foo__body__short_arg_unused, sh_val);
  MEASURE_WITH_ARG (foo__body__short_arg_used,   sh_val);
  MEASURE_WITH_ARG (foo__body__short_ref_unused, sh_val);
  MEASURE_WITH_ARG (foo__body__short_ref_used,   sh_val);
  MEASURE_WITH_ARG (foo__body__int_arg_unused,   int_val);
  MEASURE_WITH_ARG (foo__body__int_arg_used,     int_val);
  MEASURE_WITH_ARG (foo__body__int_ref_unused,   int_val);
  MEASURE_WITH_ARG (foo__body__int_ref_used,     int_val);
  // -------------------------------
  MEASURE_WITH_NO_ARG (foo__no_body__no_args);
  MEASURE_WITH_ARG (foo__no_body__char_arg_unused,  ch_val);
  MEASURE_WITH_ARG (foo__no_body__char_ref_unused,  ch_val);
  MEASURE_WITH_ARG (foo__no_body__short_arg_unused, sh_val);
  MEASURE_WITH_ARG (foo__no_body__short_ref_unused, sh_val);
  MEASURE_WITH_ARG (foo__no_body__int_arg_unused,   int_val);
  MEASURE_WITH_ARG (foo__no_body__int_ref_unused,   int_val);
  // -------------------------------
  MEASURE_WITH_NO_ARG (foo__dummy_end);
}
// ------------
void show (int no_of_tests)
{
#define FACTOR 100
clock_t ticks;
clock_t sum;
  iter_names = find (foo_names.begin(), foo_names.end(), "foo__body__int_arg_used");
  assert (iter_names != foo_names.end());
const int normalizator_no = distance (foo_names.begin(), iter_names);
assert (no_of_tests == used_time[normalizator_no].size());
    sum = 0;
    for (int k = 0; k < used_time[normalizator_no].size(); k++)
    {
      sum += used_time[normalizator_no][k];
    }
const clock_t normalizator_value = sum/used_time[normalizator_no].size();
  cout << endl;
  assert (foo_names.size() == used_time.size());
  for (int i = 0; i < foo_names.size(); i++)
  {
    sum = 0;
    assert (no_of_tests == used_time[i].size());
    for (int k = 0; k < used_time[i].size(); k++) sum += used_time[i][k];
    ticks = sum/used_time[i].size();
    cout << setw(30)
         << std::left
         << foo_names[i]
         << " : "
         << setw(6)
         << std::right
         << ticks
         << " ticks"
         << " ("
         << (float(ticks)/float(CLOCKS_PER_SEC))
         << " secs;  "
         << setw(4)
         << std::right
         << ((ticks * FACTOR)/normalizator_value)
         << " normalized units)"
         << endl;
  }
}
// ------------
int main(int argc, char** argv)
{
  cerr << endl;
  cerr << "\tYOUR COMMAND LINE : ";
  for (int i = 0; i < argc; i++) cerr << argv[i] << " ";
  cerr << endl;
  cerr << endl;
  if (!(argc >= 3))
  {
    cerr << "\tUSAGE : " << argv[0] << " " << "<No. of tests> <No. of repetitions>" << endl;
    return 1;
  }
  assert (argc >= 3);
const int no_of_tests       = atoi (argv[1]);
  assert (no_of_tests > 0);
const int no_of_repetitions = atoi (argv[2]);
  assert (no_of_repetitions > 0);
  cerr << "\t### Number of tests       : " << no_of_tests << endl;
  cerr << "\t### Number of repetitions : " << no_of_repetitions << endl;
  cerr << "\t### CLOCKS_PER_SEC        : " << CLOCKS_PER_SEC << endl;
  cerr << endl;
  // -----------------------------
  for (int i = 0; i < no_of_tests; i++) measure (no_of_repetitions);
  show (no_of_tests);
  return (sink%2);
}
--
   =====================================
   Alex Vinokur
     mailto:ale...@connect.to
     http://mathforum.org/library/view/10978.html
   =====================================
int test_no = 0;
if (!(end_time > start_time)) { cout << "Number of repetitions is too small" << endl << "Good Luck" << endl << endl; exit(1); }\
  assert (end_time > start_time); \
  if (find (foo_names.begin(), foo_names.end(), #y) == foo_names.end()) \
  { \
    foo_names.push_back (#y); \
    used_time.push_back (vector<clock_t>()); \
  } \
  assert (foo_names.size() == used_time.size()); \
  iter_names = find (foo_names.begin(), foo_names.end(), #y); \
  assert (iter_names != foo_names.end()); \
  used_time[distance (foo_names.begin(), iter_names)].push_back ((end_time - start_time))
#define MEASURE_WITH_ARG(foo, argument) MEASURE_IT (foo(argument), foo)
#define MEASURE_WITH_NO_ARG(foo) MEASURE_IT (foo(), foo)
// ------------
void measure (int no_of_repetitions)
{
const char  ch_val  = 'a';
const short sh_val  = 'a';
const int   int_val = 'a';
clock_t start_time;
clock_t end_time;
vector<clock_t> elapsed_time_vect;
  cout << "\t---> Test-" << ++test_no << " started" << endl;
  // -------------------------------
  MEASURE_WITH_NO_ARG (foo__dummy_start);
  // -------------------------------
  MEASURE_WITH_NO_ARG (foo__body__no_args);
  // -------------------------------
  MEASURE_WITH_NO_ARG (foo__no_body__no_args);
  // -------------------------------
  MEASURE_WITH_NO_ARG (foo__dummy_end);
  cerr << "\t     Test-" << test_no << " finished" << endl;
}
         << " (";
    cout.setf(ios::fixed, ios::floatfield);
    cout << setprecision (3)
         << (float(ticks)/float(CLOCKS_PER_SEC))
         << " secs;  "
         << setw(4)
         << std::right
         << ((ticks * FACTOR)/normalizator_value)
         << " normalized units)"
         << endl;
  }
}
// ------------
void run (int no_of_runs, int no_of_tests, int no_of_repetitions)
{
  for (int i = 0; i < no_of_runs; i++)
  {
    test_no = 0;
    foo_names.clear();
    used_time.clear();
    // ----------------------
    cout << endl << endl << "   Run-" << (i + 1) << " of " << no_of_runs << " : Started"<< endl;
    for (int k = 0; k < no_of_tests; k++) measure (no_of_repetitions);
    show (no_of_tests);
    cerr << "   Run-" << (i + 1) << " of " << no_of_runs << " : Finished"<< endl << endl;
  }
}
// ------------
int main(int argc, char** argv)
{
  cout << endl;
  cout << "\tYOUR COMMAND LINE : ";
  for (int i = 0; i < argc; i++) cout << argv[i] << " ";
  cout << endl;
  cout << endl;
  if (!(argc >= 3))
  {
    cout << "\tUSAGE : "
         << argv[0]
         << " "
         << "<No. of tests> <No. of repetitions> [<No. of runs>]"
         << endl;
    return 1;
  }
  assert (argc >= 3);
const int no_of_tests       = atoi (argv[1]);
  assert (no_of_tests > 0);
const int no_of_repetitions = atoi (argv[2]);
  assert (no_of_repetitions > 0);
const int no_of_runs       = ((argc > 3) ? atoi (argv[3]) : 1);
  assert (no_of_runs > 0);
  cout << "\t### Number of runs        : " << no_of_runs << endl;
  cout << "\t### Number of tests       : " << no_of_tests << endl;
  cout << "\t### Number of repetitions : " << no_of_repetitions << endl;
  cout << "\t### CLOCKS_PER_SEC        : " << CLOCKS_PER_SEC << endl;
  cout << endl;
  // -----------------------------
  run (no_of_runs, no_of_tests, no_of_repetitions);
  return (sink%2);
}
--
   ==========================
   Alex Vinokur
     mailto:ale...@connect.to
     
http://lists.sourceforge.net/lists/listinfo/cpp-perfometer-users
     news://news.gmane.org/gmane.comp.lang.c++.perfometer
   ==========================