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 <Benchmark\Benchmark.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 */