Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 137

 
Alexey Navoykov:
Non sembra trattarsi di operazioni aritmetiche, perché non ce ne sono, tutti i valori sono calcolati in fase di compilazione. La ragione è la presenza di un ciclo con un numero sconosciuto di iterazioni (anche se queste iterazioni sono in media meno di due). Quindi il tuo codice è in qualche modo ottimizzato da un numero noto di chiamate rand()

https://www.mql5.com/ru/forum/308881/page3#comment_11222192

 
Vict:

Cosa c'entrano gli sviluppatori di processori? Il generatore è implementato via software.

No, non lo è. Questo generatore è implementato in hardware. Questa velocità non può essere raggiunta dal software - questo è ovvio.

 
Nikolai Semko:

No, certo che no. Questo generatore è implementato in hardware. Questa velocità non può essere raggiunta dal software - è ovvio.

In realtà, l'hardware implementa un generatore RAND(), mentre rand() è uno pseudorandom.

MathRand

Restituisce un numero intero pseudo-casuale nell'intervallo da 0 a 32767.

Non ho molta familiarità con l'hardware, ma probabilmente rimarrai deluso - non sembra funzionare molto velocemente, è buono solo come seme per pseudorandom.
 
Vict:

Beh, in realtà, l'hardware implementa un generatore RAND(), mentre rand() è uno pseudo-casuale, è scritto nel manuale

Non ho molta familiarità con quello hardware, ma probabilmente sarai deluso - non sembra funzionare molto velocemente, è buono solo come seme per pseudorandom.

chiaramente - pseudo.

Random è molto più lento(https://en.wikipedia.org/wiki/RdRand)

 
Nikolai Semko:

Chiaramente pseudo.

random funziona molto più lentamente(https://en.wikipedia.org/wiki/RdRand)

Beh, sì, c'è anche lo pseudo. Ma sono sicuro - rand() è implementato programmaticamente. Forse uno dei compagni più "anziani" che passano di qui lo confermerà.

 
Vict:

Beh, sì, hanno messo anche uno pseudo. Ma sono sicuro - rand() è implementato programmaticamente. Forse uno dei compagni più "anziani" che passano di qui lo confermerà.

Non escludo che lei possa avere ragione. Se ho un minuto libero, cercherò di implementare qualcosa di simile. Anche se dubito di poterlo fare in un nanosecondo, ma se posso allontanarmi dai cicli, penso di poterlo fare in 5.
 
Vict:

Ma sono sicuro - rand() è implementato programmaticamente. Forse uno dei compagni più "anziani" che passano di qui lo confermerà.

Sì, forse hai ragione.
Questa variante della funzione rand16() che genera numeri pre-random funziona meno della metà della lentezza della funzione originale e genera numeri casuali da 0 a 65535.

ushort rand16() { return(((ushort)rand8()<<8)|(ushort)rand8());}


uchar rand8()
{
    staticushort s[10] = { 0x52, 0x8e, 0xdc, 0x61, 0x35, 0xbc, 0x5c, 0xb6 };
    staticushort c = 0xa6;
    staticint i = 0;
    ushort t;
    uchar x;
    
    x = (uchar)s[i];
    t = (ushort)x  + c;
    c = t >> 8;
    c += x;
    x = (uchar)t & 255;
    s[i] = x;
    i++;
    i=i&7;
    return x;
}

cioè meno di 2 nanosecondi.

2019.06.09 23:52:15.855 TestSpeedRand (US30Index,H1)    Время формирования случайных массивов = 9068  микросекунд. Всего сгенерировано 4655770 случайных чисел rand()
2019.06.09 23:52:17.892 TestSpeedRand (US30Index,H1)    Время формирования случайных массивов = 16562 микросекунд. Всего сгенерировано 4655770 случайных чисел rand16()
2019.06.09 23:52:19.940 TestSpeedRand (US30Index,H1)    Время формирования случайных массивов = 22299 микросекунд. Всего сгенерировано 4655770 случайных чисел get_rand()
2019.06.09 23:52:21.986 TestSpeedRand (US30Index,H1)    Время формирования случайных массивов = 20094 микросекунд. Всего сгенерировано 4655770 случайных чисел randUlong()
2019.06.09 23:52:24.020 TestSpeedRand (US30Index,H1)    Время формирования случайных массивов = 14660 микросекунд. Всего сгенерировано 4655770 случайных чисел randUint()
2019.06.09 23:52:26.053 TestSpeedRand (US30Index,H1)    Время формирования случайных массивов = 12543 микросекунд. Всего сгенерировано 4655770 случайных чисел randShort()
2019.06.09 23:52:28.095 TestSpeedRand (US30Index,H1)    Время формирования случайных массивов = 20883 микросекунд. Всего сгенерировано 4655770 случайных чисел RandomLong()
File:
 
// Некоторые возможности структур, которых нет у классов.

// #define struct class // Смотрим ошибки, которые возникают при замене структур на классы.

struct A
{
public:  
  int i;
  
  uint Save( const int handle) { return(FileWriteStruct(handle, this)); } // Запись себя
  uint Load( const int handle) { return(FileReadStruct(handle, this)); }  // Чтение себя
};

// Использование в объединениях
union UNION
{
  uchar b1[sizeof(A)];
  A b2;
};

// Выравнивание
struct pack(sizeof(A)) B : public A
{
  short j;
};

// Структура со скрытым полем
struct C : private A
{
public:  
  void Set( const int Num ) { this.i = Num; }  
  int Get( void ) const { return(this.i); }  
};

// Структура с неизменяемым полем.
struct D
{
public:  
  const A a;
};

template <typename T1, typename T2>
void FromTo( const T1 &ValueFrom, T2 &ValueTo )
{
  uchar Bytes[];    

  StructToCharArray(ValueFrom, Bytes); // В массив байтов
  CharArrayToStruct(ValueTo, Bytes);   // Из массива байтов  
}

void OnStart()
{
  A a[1] = {0};
  
  FileReadArray(0, a);  // Чтение массива
  FileWriteArray(0, a); // Запись массива

  ArrayCopy(a, a); // Копирование массивов
  ZeroMemory(a);   // Обнуление массивов
    
  C c; // Структура со скрытым полем
  c.Set(7);

  FromTo(c, a[0]);
  Print(a[0].i); // Достали значение приватного поля из C.
  
  D d; // Структура с неизменяемым полем.

  a[0].i = 5;
  
  FromTo(a[0], d);
  Print(d.a.i); // Изменили const-поле.    

  FromTo(a[0], c);
  Print(c.Get()); // Изменили private-поле.    
}
Inoltre, l'oggetto classe è 16 byte più grande dell'oggetto di una struttura POD simile. Così, gli array di strutture sono ancora più economici.
 
fxsaber:
Inoltre, l'oggetto classe è 16 byte più grande dell'oggetto di una struttura POD simile. Così, gli array di strutture sono ancora più economici.
Classe!
 
Una delle risposte alla domanda nel titolo del thread citato

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Qual è la differenza tra Symbol() e _Symbol

fxsaber, 2019.07.07 14:47

void Func( const string& ) {}

void OnStart()
{
  Func(Symbol()); // ERROR: 'Symbol' - parameter passed as reference, variable expected
  Func(_Symbol);  // OK   
}

Se Symbol() è chiamata all'interno di una classe/struttura senza ::, potrebbe essere più conveniente di una variabile predefinita, poiché si può fare una sostituzione veloce dichiarando un metodo con lo stesso nome.