CBitBuffer/TicksShort_VLQ/TicksShort_Performance.mq5
amrali ca446cab20
2025-10-08 07:25:58 +03:00

58 lines
No EOL
4.7 KiB
MQL5

#property script_show_inputs
input datetime inFrom = D'2024.12.01';
//#include "TicksShort.mqh" // Короткий формат хранения тиков.
#include "TicksShortLite.mqh"
// Возвращает размер массива в байтах.
template <typename T>
ulong GetSize( const T &Array[] ) { return((ulong)sizeof(T) * ArraySize(Array)); }
template <typename T1, typename T2>
double Criterion( const T1 &Decompression[], const T2 &Compression[], const ulong Interval )
{
const double Performance = (double)ArraySize(Decompression) / Interval;
return(Performance * ((double)GetSize(Decompression) / GetSize(Compression)));
}
void OnStart()
{
MqlTick Ticks[]; // Для исходных тиков.
if (CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL,(ulong)inFrom * 1000) > 0)
{
//TICK_SHORT Ticks2[]; // Для сжатых тиков.
uchar Ticks2[];
ulong Interval = GetMicrosecondCount();
TICKS_SHORT::Compress(Ticks, Ticks2); // Сжали.
Interval = GetMicrosecondCount() - Interval;
const double Performance = (double)ArraySize(Ticks) / Interval;
// https://www.mql5.com/ru/forum/490384#comment_57497700
long n1 = ArraySize(Ticks) * (long)sizeof(MqlTick);
//long n2 = ArraySize(Ticks2) * (long)sizeof(TICK_SHORT);
long n2 = ArraySize(Ticks2) * (long)sizeof(uchar);
PrintFormat("Compressed %I64i bytes into %I64i bytes ==> %.2f%%",n1,n2,(double)n2/n1*100);
Print("Compress performance: " + DoubleToString(Performance * sizeof(MqlTick) / 1.04858, 0) + " MB/s");
Print("Compress performance: " + DoubleToString(Performance, 1) + " Ticks (millions)/sec.");
Print("Compress performance criterion: " + DoubleToString(Criterion(Ticks, Ticks2, Interval), 1));
MqlTick Ticks3[]; // Для разжатых тиков.
ulong Interval2 = GetMicrosecondCount();
TICKS_SHORT::Decompress(Ticks2, Ticks3); // Разжали.
Interval2 = GetMicrosecondCount() - Interval2;
const double Performance2 = (double)ArraySize(Ticks3) / Interval2;
Print("Decompress performance: " + DoubleToString(Performance2 * sizeof(MqlTick) / 1.04858, 0) + " MB/s");
Print("Decompress performance: " + DoubleToString(Performance2, 1) + " Ticks (millions)/sec.");
Print("Decompress performance criterion: " + DoubleToString(Criterion(Ticks3, Ticks2, Interval2), 1));
Print("Correct = " + (string)TICKS_SHORT::IsEqual(Ticks, Ticks3)); // Сравнили.
}
}