Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 137

 
Alexey Navoykov:
Es scheint sich nicht um arithmetische Operationen zu handeln, denn es gibt keine, alle Werte werden in der Kompilierungsphase berechnet. Der Grund dafür ist das Vorhandensein einer Schleife mit einer unbekannten Anzahl von Iterationen (obwohl diese Iterationen im Durchschnitt weniger als zwei sind). Ihr Code wird also irgendwie durch eine bekannte Anzahl von rand()-Aufrufen optimiert

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

 
Vict:

Was haben Prozessorentwickler damit zu tun? Der Generator ist in Software implementiert.

Nein, das ist es nicht. Dieser Generator ist in Hardware implementiert. Diese Geschwindigkeit kann nicht durch Software erreicht werden - das ist offensichtlich.

 
Nikolai Semko:

Nein, natürlich nicht. Dieser Generator ist in Hardware implementiert. Diese Geschwindigkeit kann nicht durch Software erreicht werden - das ist offensichtlich.

Die Hardware implementiert einen RAND()-Generator, während rand() ein Pseudozufallsgenerator ist.

MathRand

Gibt eine pseudozufällige Ganzzahl im Bereich von 0 bis 32767 zurück.

Ich bin nicht sehr vertraut mit der Hardware, aber Sie werden wahrscheinlich enttäuscht sein - es scheint nicht sehr schnell zu funktionieren, es ist nur als Seed für Pseudozufallszahlen geeignet.
 
Vict:

Nun, eigentlich implementiert die Hardware einen RAND()-Generator, während rand() ein Pseudo-Zufallsgenerator ist, so steht es im Handbuch

Ich bin nicht sehr vertraut mit der Hardware, aber Sie werden wahrscheinlich enttäuscht sein - sie scheint nicht sehr schnell zu laufen, sie ist nur als Seed für Pseudozufallszahlen geeignet.

eindeutig - pseudo.

Der Zufallsmodus ist viel langsamer(https://en.wikipedia.org/wiki/RdRand)

 
Nikolai Semko:

Eindeutig pseudo.

Zufallsgenerator läuft viel langsamer(https://en.wikipedia.org/wiki/RdRand)

Nun, ja, Pseudo ist auch drin. Aber ich bin sicher - rand() ist programmatisch implementiert. Vielleicht kann einer der "älteren" Kameraden, die hier vorbeikommen, dies bestätigen.

 
Vict:

Nun, ja, sie haben auch ein Pseudo eingebaut. Aber ich bin sicher - rand() ist programmatisch implementiert. Vielleicht kann einer der "älteren" Kameraden, die hier vorbeikommen, dies bestätigen.

Ich schließe nicht aus, dass Sie Recht haben könnten. Wenn ich eine freie Minute habe, werde ich versuchen, etwas Ähnliches zu implementieren. Ich bezweifle zwar, dass ich es in einer Nanosekunde schaffe, aber wenn ich von den Zyklen wegkomme, schaffe ich es wohl in 5.
 
Vict:

Aber ich bin sicher - rand() ist programmatisch implementiert. Vielleicht kann einer der "älteren" Kameraden, die hier vorbeikommen, dies bestätigen.

Ja, vielleicht haben Sie Recht.
Diese Variante der rand16()-Funktion zur Erzeugung von Vor-Zufallszahlen arbeitet weniger als halb so langsam wie die Originalfunktion und erzeugt Zufallszahlen von 0 bis 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;
}

d.h. weniger als 2 Nanosekunden.

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

// #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-поле.    
}
Darüber hinaus ist das Klassenobjekt 16 Byte größer als das Objekt einer ähnlichen POD-Struktur. Daher sind Arrays von Strukturen noch wirtschaftlicher.
 
fxsaber:
Darüber hinaus ist das Klassenobjekt 16 Byte größer als das Objekt einer ähnlichen POD-Struktur. Das heißt, Arrays von Strukturen sind noch wirtschaftlicher.
Klasse!
 
Eine der Antworten auf die Frage im zitierten Threadtitel

Forum zum Thema Handel, automatische Handelssysteme und Testen von Handelsstrategien

Was ist der Unterschied zwischen Symbol() und _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   
}

Wenn Symbol() innerhalb einer Klasse/Struktur ohne :: aufgerufen wird, kann es praktischer sein als eine vordefinierte Variable, da Sie eine schnelle Ersetzung vornehmen können, indem Sie eine Methode mit demselben Namen deklarieren.