MQL5Book/Scripts/p4/StringReserve.mq5
super.admin 1c8e83ce31 convert
2025-05-30 16:09:41 +02:00

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
*/
}
//+------------------------------------------------------------------+