forked from rosh/MQL5Book
76 lines
No EOL
2.3 KiB
MQL5
76 lines
No EOL
2.3 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| StringBenchmark.mqh |
| |
//| Copyright 2021, MetaQuotes Ltd. |
| |
//| https://www.mql5.com |
| |
//+------------------------------------------------------------------+
| |
| |
//+------------------------------------------------------------------+
| |
//| Facultative study: Benchmark |
| |
//| Base class which provides common benchmarking functionalty |
| |
//+------------------------------------------------------------------+
| |
class Benchmark
| |
{
| |
protected:
| |
int i; // loop variable
| |
static Benchmark *array[]; // all test-cases are accumulated here
| |
| |
public:
| |
Benchmark()
| |
{
| |
// store all instances of Benchmark in the static array
| |
const int n = ArraySize(array);
| |
ArrayResize(array, n + 1);
| |
array[n] = &this;
| |
}
| |
| |
virtual void init() = 0; // abstract method to prepare algorithm
| |
virtual void calc() = 0; // abstract method to do main job
| |
virtual void done() = 0; // abstract method to finalize
| |
| |
// main method for testing all created instances
| |
static void runAll(const int n)
| |
{
| |
for(int k = 0; k < ArraySize(array); ++k)
| |
{
| |
array[k].run(n);
| |
}
| |
}
| |
| |
// main method of every specific test instance
| |
// it provides the same job scheme for all kinds of tests:
| |
// 'init', 'calc' in the loop, 'done'
| |
void run(const int n)
| |
{
| |
init();
| |
uint time0 = GetTickCount();
| |
for(i = 0; i < n; ++i)
| |
{
| |
calc();
| |
}
| |
Print(GetTickCount() - time0, "ms");
| |
done();
| |
}
| |
};
| |
| |
static Benchmark *Benchmark::array[];
| |
| |
//+------------------------------------------------------------------+
| |
//| Base class for benchmarking of string building |
| |
//+------------------------------------------------------------------+
| |
class StrBase : public Benchmark
| |
{
| |
protected:
| |
string t; // output string, will take result
| |
| |
public:
| |
void init() override
| |
{
| |
t = NULL;
| |
}
| |
| |
void done() override
| |
{
| |
Print("L:", StringLen(t), ", B:", StringBufferLen(t));
| |
}
| |
};
| |
//+------------------------------------------------------------------+ |