Benchmark – library MetaTrader 5

The include file “Benchmark.mqh” has a set of macros to benchmark various functions for their execution speeds to decide which is the fastest one.

//+------------------------------------------------------------------+
//| Macro to measure the execution time a function.                  |
//| Prints the elapsed time in microseconds per call (µsec/call).    |
//| TimeIt(sum += ArrayBsearch(arr, value));                         |
//+------------------------------------------------------------------+
#define TimeIt(func_invocation)


//+------------------------------------------------------------------+
//| Macro to execute a function for a fixed number of times.         |
//| Prints the elapsed time in milliseconds (msec).                  |
//| Benchmark(repeats, sum += ArrayBsearch(arr, value));             |
//+------------------------------------------------------------------+
#define Benchmark(repeats, func_invocation)


//+------------------------------------------------------------------+
//| Macro to execute a function for a fixed duration in msec.        |
//| Prints the number of operations per second (ops/sec).            |
//| Benchmark_opsec(msec, sum += ArrayBsearch(arr, value));          |
//+------------------------------------------------------------------+
#define Benchmark_opsec(msec, func_invocation)

The library is based on public source codes of timeit module in python https://docs.python.org/3/library/timeit.html and Stopwatch Class from C# https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.stopwatch 


Here is an example script for usage:

//+------------------------------------------------------------------+
//|                                               benchmark_test.mq5 |
//|                                        Copyright © 2018, Amr Ali |
//|                             https://www.mql5.com/en/users/amrali |
//+------------------------------------------------------------------+
#include <BenchmarkBenchmark.mqh>

//+------------------------------------------------------------------+
//| The function returns integer numeric value closest from below.   |
//+------------------------------------------------------------------+
double FastFloor(const double v)
  {
   double k = (double)(long)v;
   return k - (v < k);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart(void)
  {
   int repeats = 1e8;
   Print("repeats=",repeats);

//--- if result of the expression is not used, compiler optimizes out
//--- (i.e., ignores) the function call.
   double sum = 0;

   Benchmark(repeats, sum += MathFloor(__i));
   Benchmark(repeats, sum += FastFloor(__i));

   Print("sum=",sum);
  }
//+------------------------------------------------------------------+

// sample output:
/*
 repeats=100000000
 sum+=MathFloor(__i) -> 599 msec
 sum+=FastFloor(__i) -> 138 msec
 sum=9999999922280040.0
*/
    📈 ROBOTFX MetaTrader Expert Advisors and Indicators to maximize profits and minimize the risks