//+------------------------------------------------------------------+ //| 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 #include //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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"); } //+------------------------------------------------------------------+