mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 137

 
Alexey Navoykov :
산술 연산 에 관한 것이 아닌 것 같습니다. 거기에 없기 때문에 모든 값은 컴파일 단계에서 계산됩니다. 그 이유는 반복 횟수를 알 수 없는 주기가 있기 때문입니다(이러한 반복 횟수는 평균 2회 미만이지만). 따라서 코드는 알려진 수의 rand() 호출에 의해 어떻게 든 최적화됩니다.

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

 
Vict :

프로세서 개발자는 어떻습니까? 생성기 - 소프트웨어가 구현되었습니다.

당연히 아니지. 이 생성기는 하드웨어로 구현됩니다. 프로그래밍 방식으로 이 속도는 달성할 수 없습니다. 이것은 명백합니다.

[삭제]  
Nikolai Semko :

당연히 아니지. 이 생성기는 하드웨어로 구현됩니다. 프로그래밍 방식으로 이 속도는 달성할 수 없습니다. 이것은 명백합니다.

음, 실제로, 그들은 하드웨어에서 RANDOM 생성기를 구현하고, rand()는 의사-랜덤 생성기입니다. 참고서에 이에 대해 설명되어 있습니다.

매스랜드

0에서 32767 사이의 의사 난수 정수를 반환합니다.

나는 하드웨어에 익숙하지 않지만 아마도 실망할 것입니다. 매우 빠르게 작동하지 않는 것 같으며 의사 난수를 위한 시드로서만 좋습니다.
 
Vict :

음, 실제로, 그들은 하드웨어에서 RANDOM 생성기를 구현하고, rand()는 의사-랜덤 생성기입니다. 참고서에 이에 대해 설명되어 있습니다.

나는 하드웨어에 익숙하지 않지만 아마도 실망할 것입니다. 매우 빠르게 작동하지 않는 것 같으며 의사 난수를 위한 시드로서만 좋습니다.

재 그루터기 - 의사.

임의의 것들은 훨씬 느립니다( https://en.wikipedia.org/wiki/RdRand )

[삭제]  
Nikolai Semko :

재 그루터기 - 의사.

임의의 것들은 훨씬 느립니다( https://en.wikipedia.org/wiki/RdRand )

글쎄, 그들은 의사를 넣었습니다. 하지만 rand()는 프로그래밍 방식으로 구현됩니다. 아마도 지나가는 "선배"동지 중 한 명이 이것을 확인할 것입니다.

 
Vict :

글쎄, 그들은 의사를 넣었습니다. 하지만 rand()는 프로그래밍 방식으로 구현됩니다. 아마도 지나가는 "선배"동지 중 한 명이 이것을 확인할 것입니다.

나는 당신이 옳을 수도 있다는 것을 배제하지 않습니다. 무료 시간이있을 것입니다. 비슷한 것을 구현하려고 시도해야합니다. 나노초 이내로 유지할 수 있을지는 의문이지만, 사이클에서 벗어날 수 있다면 5를 만날 수 있을 거라 생각합니다.
 
Vict :

하지만 rand()는 프로그래밍 방식으로 구현됩니다. 아마도 지나가는 "선배"동지 중 한 명이 이것을 확인할 것입니다.

예, 아마도 당신이 옳을 것입니다.
사전 난수를 생성하기 위한 이 버전의 rand16() 함수는 원래 함수보다 2배 미만 느리고 0에서 65535 사이의 난수를 생성합니다.

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


uchar rand8()
{
     static ushort s[ 10 ] = { 0x52 , 0x8e , 0xdc , 0x61 , 0x35 , 0xbc , 0x5c , 0xb6 };
     static ushort c = 0xa6 ;
     static int 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()이 :: 없이 클래스/구조체 내부에서 호출되면 미리 정의된 변수보다 더 편리할 수 있습니다. 같은 이름의 메서드를 선언하여 빠르게 대체할 수 있습니다.