Caractéristiques du langage mql5, subtilités et techniques - page 137

 
Alexey Navoykov:
Il ne semble pas s'agir d'opérations arithmétiques, car il n'y en a pas, toutes les valeurs sont calculées à la compilation. La raison est la présence d'une boucle avec un nombre inconnu d'itérations (bien que ces itérations soient en moyenne inférieures à deux). Votre code est donc en quelque sorte optimisé par un nombre connu d'appels à rand().

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

 
Vict:

Qu'est-ce que les développeurs de processeurs ont à voir là-dedans ? Le générateur est implémenté par logiciel.

Non, ça ne l'est pas. Ce générateur est implémenté dans le matériel. Cette vitesse ne peut être atteinte par un logiciel - c'est évident.

 
Nikolai Semko:

Non, bien sûr que non. Ce générateur est implémenté dans le matériel. Cette vitesse ne peut être atteinte par un logiciel - c'est évident.

En fait, le matériel implémente un générateur RAND(), alors que rand() est un générateur pseudo-aléatoire.

MathRand

Renvoie un nombre entier pseudo-aléatoire compris entre 0 et 32767.

Je ne suis pas très familier avec le matériel, mais vous serez probablement déçu - il ne semble pas fonctionner très rapidement, il n'est bon que comme graine pour le pseudo-aléatoire.
 
Vict:

En fait, le matériel implémente un générateur RAND(), alors que rand() est un pseudo-aléatoire, c'est écrit dans le manuel

Je ne suis pas très familier avec le matériel, mais vous serez probablement déçu - il ne semble pas fonctionner très rapidement, il n'est bon que comme semence pour le pseudo-aléatoire.

clairement - pseudo.

Random est beaucoup plus lent(https://en.wikipedia.org/wiki/RdRand)

 
Nikolai Semko:

Clairement pseudo.

le hasard fonctionne beaucoup plus lentement(https://en.wikipedia.org/wiki/RdRand)

Eh bien, oui, le pseudo est aussi poussé dedans. Mais je suis sûr que rand() est implémenté de manière programmatique. Peut-être qu'un des "vieux" camarades de passage pourra le confirmer.

 
Vict:

Eh bien, oui, ils ont mis un pseudo aussi. Mais je suis sûr que rand() est implémenté de manière programmatique. Peut-être qu'un des "vieux" camarades de passage pourra le confirmer.

Je n'exclus pas que vous puissiez avoir raison. Si j'ai une minute de libre, je vais essayer de mettre en œuvre quelque chose de similaire. Bien que je doute de pouvoir le faire en une nanoseconde, mais si je peux m'éloigner des cycles, je pense pouvoir le faire en 5.
 
Vict:

Mais j'en suis sûr - rand() est implémenté de manière programmatique. Peut-être qu'un des "vieux" camarades de passage pourra le confirmer.

Oui, vous avez peut-être raison.
Cette variante de la fonction rand16() générant des nombres pré-aléatoires fonctionne moins de la moitié de la lenteur de la fonction originale et génère des nombres aléatoires de 0 à 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;
}

c'est-à-dire moins de 2 nanosecondes.

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

// #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-поле.    
}
En outre, l'objet de la classe est 16 octets plus grand que l'objet d'une structure POD similaire. Ainsi, les réseaux de structures sont encore plus économiques.
 
fxsaber:
En outre, l'objet de la classe est 16 octets plus grand que l'objet d'une structure POD similaire. Ainsi, les réseaux de structures sont encore plus économiques.
La classe !
 
Une des réponses à la question posée dans le titre du fil de discussion cité

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Quelle est la différence entre Symbol() et _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 Symbol() est appelé à l'intérieur d'une classe/structure sans : :, il peut être plus pratique qu'une variable prédéfinie, car vous pouvez faire une substitution rapide en déclarant une méthode avec le même nom.