219 lines
5.1 KiB
MQL5
219 lines
5.1 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| ToStr.mq5 |
|
|
//| Copyright 2026, Niquel Mendoza. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2026, Niquel Mendoza."
|
|
#property link "https://www.mql5.com"
|
|
#property version "1.00"
|
|
#property strict
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
#include <TSN\\Tables\\Basic.mqh>
|
|
#include <TSN\\BInt\\Def.mqh>
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
namespace TSN
|
|
{
|
|
|
|
int CountDigits(const ulong v)
|
|
{
|
|
if(v < 10000000000ULL)
|
|
{
|
|
if(v < 100000ULL)
|
|
{
|
|
if(v < 100ULL)
|
|
return (v < 10ULL) ? 1 : 2;
|
|
if(v < 1000ULL)
|
|
return 3;
|
|
return (v < 10000ULL) ? 4 : 5;
|
|
}
|
|
if(v < 10000000ULL)
|
|
return (v < 1000000ULL) ? 6 : 7;
|
|
if(v < 1000000000ULL)
|
|
return (v < 100000000ULL) ? 8 : 9;
|
|
return 10;
|
|
}
|
|
if(v < 1000000000000000ULL) // 11 a 15
|
|
{
|
|
if(v < 1000000000000ULL)
|
|
return (v < 100000000000ULL) ? 11 : 12;
|
|
if(v < 100000000000000ULL)
|
|
return (v < 10000000000000ULL) ? 13 : 14;
|
|
return 15;
|
|
}
|
|
if(v < 100000000000000000ULL)
|
|
return (v < 10000000000000000ULL) ? 16 : 17;
|
|
if(v < 10000000000000000000ULL)
|
|
return (v < 1000000000000000000ULL) ? 18 : 19;
|
|
return 20;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void ToValueNSigned(const long value, uchar &in[], int& w)
|
|
{
|
|
//---
|
|
if(value == 0)
|
|
{
|
|
in[w++] = '0';
|
|
return;
|
|
}
|
|
|
|
//---
|
|
ulong uvalue;
|
|
if(value < 0)
|
|
{
|
|
in[w++] = '-';
|
|
uvalue = ulong(-(value + 1)) + 1;
|
|
}
|
|
else
|
|
uvalue = ulong(value);
|
|
|
|
//---
|
|
int pos = w + CountDigits(uvalue);
|
|
w = pos;
|
|
|
|
//---
|
|
while(uvalue >= 100)
|
|
{
|
|
const ulong prev = uvalue;
|
|
uvalue /= 100ULL;
|
|
const ulong idx = (prev - (uvalue * 100ULL)) << 1;
|
|
in[--pos] = g_tsn_digit_pairs[idx + 1];
|
|
in[--pos] = g_tsn_digit_pairs[idx];
|
|
}
|
|
if(uvalue >= 10)
|
|
{
|
|
const ulong idx = uvalue << 1;
|
|
in[--pos] = g_tsn_digit_pairs[idx + 1];
|
|
in[--pos] = g_tsn_digit_pairs[idx];
|
|
}
|
|
else
|
|
in[--pos] = uchar('0' + uvalue);
|
|
}
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void ToValueNSigned2(const long value, uchar &in[], int& w)
|
|
{
|
|
//---
|
|
if(value == 0)
|
|
{
|
|
in[w++] = '0';
|
|
return;
|
|
}
|
|
|
|
//--
|
|
int pos = 0;
|
|
ulong uvalue;
|
|
if(value < 0)
|
|
{
|
|
in[w++] = '-';
|
|
uvalue = ulong(-(value + 1)) + 1;
|
|
}
|
|
else
|
|
{
|
|
uvalue = ulong(value);
|
|
}
|
|
|
|
//---
|
|
static uchar digits[24];
|
|
int n = 0;
|
|
|
|
//---
|
|
while(uvalue >= 100)
|
|
{
|
|
const ulong prev = uvalue;
|
|
uvalue /= 100ULL;
|
|
const ulong idx = (prev - (uvalue * 100ULL)) << 1ULL;
|
|
digits[n++] = g_tsn_digit_pairs[idx + 1];
|
|
digits[n++] = g_tsn_digit_pairs[idx];
|
|
}
|
|
if(uvalue >= 10)
|
|
{
|
|
const ulong idx = (uvalue << 1);
|
|
digits[n++] = g_tsn_digit_pairs[idx + 1];
|
|
digits[n++] = g_tsn_digit_pairs[idx];
|
|
}
|
|
else
|
|
{
|
|
digits[n++] = uchar('0' + uvalue);
|
|
}
|
|
|
|
//---
|
|
for(int j = n - 1; j >= 0; j--)
|
|
in[w++] = digits[j];
|
|
}
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Script program start function |
|
|
//+------------------------------------------------------------------+
|
|
void OnStart()
|
|
{
|
|
const int N = 1000000;
|
|
|
|
uchar arr[];
|
|
ArrayResize(arr, 32); // una vez
|
|
|
|
long vals[];
|
|
ArrayResize(vals, N);
|
|
MathSrand(GetTickCount());
|
|
for(int i = 0; i < N; i++)
|
|
vals[i] = (long)MathRand() * MathRand() * MathRand();
|
|
|
|
|
|
ulong best1 = ULONG_MAX, best2 = ULONG_MAX;
|
|
|
|
for(int rep = 0; rep < 10; rep++)
|
|
{
|
|
for(int k = 0; k < 2; k++)
|
|
{
|
|
const bool first_is_new = ((rep + k) % 2 == 0);
|
|
|
|
|
|
//---
|
|
ulong a = GetMicrosecondCount();
|
|
if(first_is_new)
|
|
{
|
|
for(int i = 0; i < N; i++)
|
|
{
|
|
int w = 0;
|
|
TSN::ToValueNSigned(vals[i], arr, w);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for(int i = 0; i < N; i++)
|
|
{
|
|
int w = 0;
|
|
TSN::ToValueNSigned2(vals[i], arr, w);
|
|
}
|
|
}
|
|
ulong t = GetMicrosecondCount() - a;
|
|
|
|
//---
|
|
if(first_is_new)
|
|
{
|
|
if(t < best1)
|
|
best1 = t;
|
|
}
|
|
else
|
|
{
|
|
if(t < best2)
|
|
best2 = t;
|
|
}
|
|
}
|
|
}
|
|
Print("Nueva (min de 10): ", best1, " us Vieja (min de 10): ", best2, " us");
|
|
}
|
|
//+------------------------------------------------------------------+
|