forked from rosh/MQL5Book
85 lines
No EOL
2.6 KiB
MQL5
85 lines
No EOL
2.6 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| StringReserve.mq5 |
| |
//| Copyright 2021, MetaQuotes Ltd. |
| |
//| https://www.mql5.com |
| |
//+------------------------------------------------------------------+
| |
| |
#include "..\..\Include\StringBenchmark.mqh"
| |
| |
//+------------------------------------------------------------------+
| |
//| Benchmarking of string building with/without buffer reservation |
| |
//+------------------------------------------------------------------+
| |
class StringBuilder : public StrBase
| |
{
| |
protected:
| |
string filler; // small string to be appended many times to build the result
| |
const int r; // size of reserved buffer, 0 by default
| |
int capacity; // current buffer capacity of the resulting string
| |
int allocCount;// buffer reallocation stats
| |
| |
public:
| |
StringBuilder(const int reserve = 0, const int increment = 200) :
| |
r(reserve)
| |
{
| |
StringInit(filler, increment, ' ');
| |
capacity = 0;
| |
allocCount = 0;
| |
}
| |
| |
void init() override
| |
{
| |
StrBase::init();
| |
Print(typename(this) + " " + (string)r);
| |
if(r > 0) StringReserve(t, r);
| |
}
| |
| |
void calc() override
| |
{
| |
t += filler; // append small string to the resulting 't'-string
| |
| |
// detect if buffer was changed and count it up
| |
if(StringBufferLen(t) != capacity)
| |
{
| |
++allocCount;
| |
capacity = StringBufferLen(t);
| |
}
| |
}
| |
| |
void done() override
| |
{
| |
StrBase::done();
| |
Print("Capacity was reallocated ", allocCount, " times");
| |
}
| |
};
| |
| |
//+------------------------------------------------------------------+
| |
//| Script program start function |
| |
//+------------------------------------------------------------------+
| |
void OnStart()
| |
{
| |
// no inital buffer, some defaulted buffer will be allocated
| |
// and re-allocated by MT5 core ad hoc many times
| |
StringBuilder simple;
| |
// sufficient buffer is allocated beforehand
| |
StringBuilder reserved(2000000);
| |
| |
// 10000 small strings of 200 blanks each will be added
| |
// to resulting string in a loop
| |
Benchmark::runAll(10000);
| |
| |
/*
| |
output (absolute timing is specific for CPU):
| |
| |
StringBuilder 0
| |
3308ms
| |
L:2000000, B:2000024
| |
Capacity was reallocated 1672 times
| |
| |
StringBuilder 2000000
| |
0ms
| |
L:2000000, B:2000000
| |
Capacity was reallocated 1 times
| |
| |
*/
| |
}
| |
//+------------------------------------------------------------------+ |