Особенности языка mql5, тонкости и приёмы работы - страница 315

 
amrali кода векторизации массивов. Поэтому AVX не уменьшил время выполнения

Конечно. Но он увеличил его (немного).
 
Vladimir Pastushak #:
где то читал про конструкторы и деструкторы. Порядок создания и уничтожения, но никак не могу найти...
https://www.mql5.com/ru/docs/basis/variables/object_live
 
Комментарии, не относящиеся к этой теме, были перенесены в "Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам".
 
Alain Verleyen #:

2025.10.29 08:53:45.911 393227-3143 (EURUSD,H1) X64 Regular UCHAR: 391609 : 2147483640
2025.10.29 08:53:46.198 393227-3143 (EURUSD,H1) X64 Regular UINT: 287708 : 2147483640
2025.10.29 08:53:46.487 393227-3143 (EURUSD,H1) X64 Regular UNION32: 288293 : 2147483640
2025.10.29 08:53:46.681 393227-3143 (EURUSD,H1) X64 Regular UNION64: 193904 : 2147483640
2025.10.29 08:53:46.928 393227-3143 (EURUSD,H1) X64 Regular ULONG: 246861 : 2147483640

2025.10.29 08:55:48.715 393227-3143 (EURUSD,H1) AVX UCHAR: 401309 : 2147483640
2025.10.29 08:55:49.005 393227-3143 (EURUSD,H1) AVX UINT: 290088 : 2147483640
2025.10.29 08:55:49.296 393227-3143 (EURUSD,H1) AVX UNION32: 290388 : 2147483640
2025.10.29 08:55:49.490 393227-3143 (EURUSD,H1) AVX UNION64: 194669 : 2147483640
2025.10.29 08:55:49.756 393227-3143 (EURUSD,H1) AVX ULONG: 265811 : 2147483640

Спасибо за код! У меня цель уменьшить влияние проверки индекса массива на корректность, которая много тормозит. Понятно, что long-массивы требуют в восемь раз меньше таких проверок, чем char-массивы.

Ваш UNION64-вариант показал результат в два раза лучше, чем uchar[]. Несмотря на то, что в нем используется статический массив, компилятор оптимизировал работу с ним без проверок индекса. За что ему большой плюс!


В реальности хочется универсально работать с последовательными байтами. И я попытался сделать различные варианты. В итоге самый быстрый этот.

struct NEXTBYTE
{
  const uint Size;
  
  uint Pos;
  bool PosByte;

  ushort Num;
  
  NEXTBYTE( const ushort &Array[] ) : Size(::ArraySize(Array)), Pos(0), PosByte(false)
  {
  }
  
  bool Get( ushort &Byte, const ushort &Array[] )
  {
    if (this.PosByte)
    {
      Byte = this.Num >> 8;
      
      this.PosByte = false;
    }
    else if (this.Pos < this.Size)
    {
      Byte = (this.Num = Array[this.Pos++]) & 0xFF;
      
      this.PosByte = true;
    }
    else
      return(false);
    
    return(true);
  }  
};

void OnStart()
{
  uchar Array1[];
  ushort Array2[];
  
  const int Size1 = ArrayResize(Array1, INT_MAX / sizeof(ushort) * sizeof(ushort));
  const int Size2 = ArrayResize(Array2, Size1 / sizeof(ushort));
  
  const uchar Tmp = 1;  
  ArrayInitialize(Array1, Tmp);
  ArrayInitialize(Array2, (ushort)(((ushort)Tmp << 8) | Tmp));
  
  {
    const ulong StartTime = GetMicrosecondCount();
    ulong Sum = 0;
    
    for (int i = 0; i < Size1; i++)
      Sum += Array1[i];
    
    Print(GetMicrosecondCount() - StartTime); // 1153502
    Print(Sum);
  }

  {
    const ulong StartTime = GetMicrosecondCount();
    ulong Sum = 0;
    
    NEXTBYTE NextByte(Array2);
    ushort Byte;
    
    while (NextByte.Get(Byte, Array2))
      Sum += Byte;
        
    Print(GetMicrosecondCount() - StartTime); // 1568134
    Print(Sum);
  }
}

Но он оказался медленнее uchar[]. Ускорить не получается.

 
fxsaber #:

Ваш вариант UNION64 показал результат в два раза лучше, чем uchar[]. Несмотря на то, что он использует статический массив, компилятор оптимизировал работу с ним без проверки индексов. За это ему большой плюс!

Но он оказался медленнее, чем uchar[]. Я не могу его ускорить.

Итератор массивов с использованием UNION64:
struct NEXTBYTE
{
  const uint Size;

  uint Pos;

  union UINT64
  {
    ulong  i;
    uchar c[8];
  };

  UINT64 Num;

  NEXTBYTE( const ulong &Array[] ) : Size(::ArraySize(Array) * sizeof(ulong)), Pos(0)
  {
  }

  bool Get( uchar &Byte, const ulong &Array[] )
  {
    if (this.Pos < this.Size)
    {
      uint PosByte = this.Pos & 7;

      if (!PosByte)
      {
        this.Num.i = Array[this.Pos >> 3];
      }

      Byte = this.Num.c[PosByte];

      this.Pos++;

      return(true);
    }

    else
      return(false);
  }

   // Использование
    NEXTBYTE NextByte(Array2);
    uchar Byte;

    while (NextByte.Get(Byte, Array2))
      Sum += Byte;

 
amrali #:
Итератор массивов с использованием UNION64:

Я делал такое почти один в один, только сразу в виде template. К сожалению, работает медленно, а потому не имеет смысла.

 
class INIT { public: INIT() { DebugBreak(); } } GlobalInitialization;

Если эту строку сделать первой в mq5-файле, то дебаг начнется ДО начала глобальной инициализации.


Но она иногда бывает очень долгой и нужно начать дебаг ПОСЛЕ начала глобальной инициализации (перед первым On-событием - например, OnInit).

Тогда эту строку нужно прописать последней в mq5-файле.

 
Комментарии, не относящиеся к этой теме, были перенесены в "Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам".
 

Это не вопрос новичка о базовых вещах.

Кто-нибудь знает как можно программно вкл/выкл автопрокрутку во вкладке экспертов?

 
Andrei Iakovlev #:

Это не вопрос новичка о базовых вещах.

Кто-нибудь знает как можно программно вкл/выкл автопрокрутку во вкладке экспертов?

Единственная вкладка "Советники", которую я нашёл в терминале, находится в настройках (вызывается по Ctrl+O). Но там нет ни какой автопрокрутки. Что Вы имеете ввиду?