mql5言語の特徴、微妙なニュアンスとテクニック - ページ 137

 
Alexey Navoykov:
コンパイル時にすべての値が計算されるため、算術演算の 問題ではないようです。 原因は、反復回数が不明なループの存在です(反復回数は平均2回以下ですが)。 つまり、あなたのコードは、既知の数のrand()呼び出しによって何らかの最適化がなされているのです。

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

 
Vict:

プロセッサーの開発者は何のためにいるのですか?ジェネレーターはソフトウェアで実装されています。

いいえ、そんなことはありません。このジェネレーターはハードウェアで実装されています。この速さはソフトウェアでは実現できない、当たり前のことですが。

 
Nikolai Semko:

いいえ、もちろんそんなことはありません。このジェネレーターはハードウェアで実装されています。この速さはソフトウェアでは実現できない、当たり前のことなのです。

実は、ハードウェアにはRAND()ジェネレータが実装されていますが、rand()は疑似ランダムなものです。

マスランド

0〜32767の範囲の擬似乱数を 返します。

私はハードウェアにあまり詳しくないのですが、おそらくがっかりされるでしょう。あまり高速に動作しないようで、疑似乱数の種としてしか使えません。
 
Vict:

まあ、実際には、ハードウェアはRAND()ジェネレータを実装していますが、rand()は疑似ランダムなもので、ハンドブックに書いてある通りです

ハードウェアの方はあまり詳しくないのですが、おそらくがっかりされるでしょう。あまり高速に動作しないようで、擬似乱数の種としてしか使えません。

明らかに - 擬似的な

ランダムはもっと遅い(https://en.wikipedia.org/wiki/RdRand)

 
Nikolai Semko:

明らかに擬似的。

ランダム実行の速度が大幅に低下(https://en.wikipedia.org/wiki/RdRand)

まあ、そうですね、擬似も突っ込まれますね。しかし、私は確信している - rand()は、プログラム的に実装されています。もしかしたら、通りすがりの「先輩」同志が確認してくれるかもしれない。

 
Vict:

まあ、そうなんですが、擬似も入れてるんですよ。しかし、私は確信している - rand()は、プログラム的に実装されています。もしかしたら、通りすがりの「先輩」同志が確認してくれるかもしれない。

あなたが正しいかもしれないことを排除するつもりはありません。暇があれば、似たようなことを実装してみようと思います。ナノ秒では無理だろうけど、サイクルから離れれば5秒はいけると思う。
 
Vict:

しかし、私は確信している - rand()は、プログラム的に実装されています。もしかしたら、通りすがりの「先輩」同志が確認してくれるかもしれない。

はい、おそらくその通りだと思います。
この乱数生成関数rand16()の変形版は、オリジナル関数に比べて半分以下の速度で動作し、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;
}

つまり、2ナノ秒以下です。

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

// #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-поле.    
}
また、クラスオブジェクトは、類似のPOD構造のオブジェクトよりも16バイト大きくなります。そのため、構造体のアレイ化はさらに経済的である。
 
fxsaber:
また、クラスオブジェクトは、類似のPOD構造のオブジェクトよりも16バイト大きくなります。そのため、構造体のアレイ化はさらに経済的である。
クラス!
 
引用されたスレッドタイトルの質問の答えのひとつに

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

Symbol()と_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   
}

Symbol()がクラス/構造体の内部で :: なしで呼び出された場合、同じ名前のメソッドを宣言すればすぐに代入できるので、定義済み変数より便利かもしれません。

理由: