Características del lenguaje mql5, sutilezas y técnicas - página 137

 
Alexey Navoykov:
No parece que se trate de operaciones aritméticas, porque no hay ninguna, todos los valores se calculan en la fase de compilación. La razón es la presencia de un bucle con un número desconocido de iteraciones (aunque estas iteraciones tienen una media inferior a dos). Así que su código está optimizado de alguna manera por un número conocido de llamadas a rand()

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

 
Vict:

¿Qué tienen que ver los desarrolladores de procesadores? El generador está implementado por software.

No, no lo es. Este generador está implementado en hardware. Esta velocidad no se puede conseguir mediante software, es evidente.

 
Nikolai Semko:

No, claro que no. Este generador está implementado en hardware. Esta velocidad no puede lograrse mediante software: es obvio.

En realidad, el hardware implementa un generador RAND(), mientras que rand() es un pseudoaleatorio.

MathRand

Devuelve un entero pseudo-aleatorio en el rango de 0 a 32767.

No estoy muy familiarizado con el hardware, pero probablemente te decepcionará: no parece funcionar muy rápido, sólo sirve como semilla para el pseudoaleatorio.
 
Vict:

Bueno, en realidad, el hardware implementa un generador RAND(), mientras que rand() es un pseudo-aleatorio, está escrito en el manual

No estoy muy familiarizado con el de hardware, pero probablemente te decepcionará: no parece funcionar muy rápido, sólo sirve como semilla para el pseudoaleatorio.

Claramente - pseudo.

Aleatorio es mucho más lento(https://en.wikipedia.org/wiki/RdRand)

 
Nikolai Semko:

Claramente pseudo.

las carreras aleatorias son mucho más lentas(https://en.wikipedia.org/wiki/RdRand)

Bueno, sí, el pseudo también está dentro. Pero estoy seguro de que - rand() se implementa programáticamente. Quizás alguno de los compañeros "mayores" que pasen por aquí lo confirme.

 
Vict:

Pues sí, también han puesto un pseudo. Pero estoy seguro de que - rand() se implementa programáticamente. Quizás alguno de los compañeros "mayores" que pasen por aquí lo confirme.

No excluyo que puedas tener razón. Si tengo un minuto libre, intentaré poner en práctica algo similar. Aunque dudo que pueda hacerlo en un nanosegundo, pero si puedo alejarme de los ciclos, creo que puedo hacerlo en 5.
 
Vict:

Pero estoy seguro de que - rand() se implementa programáticamente. Quizás alguno de los compañeros "mayores" que pasen por aquí lo confirme.

Sí, quizás tengas razón.
Esta variante de la función rand16() que genera números pre-aleatorios funciona con menos de la mitad de lentitud que la función original y genera números aleatorios de 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;
}

es decir, menos de 2 nanosegundos.

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()
Archivos adjuntos:
 
// Некоторые возможности структур, которых нет у классов.

// #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-поле.    
}
Además, el objeto de clase es 16 bytes más grande que el objeto de una estructura POD similar. Así, las matrices de estructuras son aún más económicas.
 
fxsaber:
Además, el objeto de clase es 16 bytes más grande que el objeto de una estructura POD similar. Es decir, las matrices de estructuras son aún más económicas.
¡Clase!
 
Una de las respuestas a la pregunta del título del hilo citado

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

¿Cuál es la diferencia entre Symbol() y _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   
}

Si se llama a Symbol() dentro de una clase/estructura sin ::, puede ser más conveniente que una variable predefinida, ya que se puede hacer una sustitución rápida declarando un método con el mismo nombre.

Razón de la queja: