Вопросы по ООП в MQL5 - страница 68

 
Dmitry Fedoseev:

А что? Еще один паттерн. Вот только что-то адепты паттернов его не признали, видимо не православный, не канонический.  Почему не реккурсия? Тоже реккурсия, только не вдоль, а поперек. 

Игорь просто сетовал, что у него получается два цикла и чуда не получится впихнуть в один цикл.
Вот и вспомнился этот сайт с примером, может получится вообще без циклов обойтись. И чудо случится ))
Вот и предложил вариант, на подумать )) может впихнется без циклов.
А то что кому то, что то не по религии, это дело каждого.

 
Roman:

Игорь просто сетовал, что у него получается два цикла и чуда не получится впихнуть в один цикл.

не сетовал, а выведывал секреты у программистов :)

у меня получается, могу цикл и рекурсией обернуть (заменить), был бы толк :)

Roman:

А то что кому то, что то не по религии, это дело каждого.

дело не в религии, а в понимании, что есть устоявшиеся приемы программирования, и если эти приемы использует большинство, то значит это эффективно - эффективно по скорости, эффективно по читаемости кода, эффективно по дальнейшей поддержке, эффективно по повторному использованию...

а религия? имхо, ноу-хау в программировании, обычно это не владение материалом (или информацией) и затем распространение этих "граблей" как собственное новаторство

 
Igor Makanu:

не сетовал, а выведывал секреты у программистов :)

у меня получается, могу цикл и рекурсией обернуть (заменить), был бы толк :)

дело не в религии, а в понимании, что есть устоявшиеся приемы программирования, и если эти приемы использует большинство, то значит это эффективно - эффективно по скорости, эффективно по читаемости кода, эффективно по дальнейшей поддержке, эффективно по повторному использованию...

а религия? имхо, ноу-хау в программировании, обычно это не владение материалом (или информацией) и затем распространение этих "граблей" как собственное новаторство

В одном из примеров упоминается, что пример использует шаблон метапрограммирования.
Используя шаблоны, можно писать программы, которые выполняют вычисления во время компиляции, если конечно это подходит для задачи. 
Такие программы называются шаблонными метапрограммами.
Не спроста терминал называется MetaTrader.
;))

 
Igor Makanu:

не сетовал, а выведывал секреты у программистов :)

у меня получается, могу цикл и рекурсией обернуть (заменить), был бы толк :)

дело не в религии, а в понимании, что есть устоявшиеся приемы программирования, и если эти приемы использует большинство, то значит это эффективно - эффективно по скорости, эффективно по читаемости кода, эффективно по дальнейшей поддержке, эффективно по повторному использованию...

а религия? имхо, ноу-хау в программировании, обычно это не владение материалом (или информацией) и затем распространение этих "граблей" как собственное новаторство

Игорь, не удержался с утра и нарисовал на коленке вызов любых методов без циклов. Ну вдруг действительно пригодится. *Осторожно, использована СБ :))

#include <Arrays\List.mqh>
//+------------------------------------------------------------------+
class base : public CObject
  {
public:
   virtual void      HighPriorityTask() {}
   virtual void      Task() {}
  };
//+------------------------------------------------------------------+
class A: public base
  {
private:
   static            A*lastnode;
   static            A*rootnode;
   static int        ID_counter;

public:
   int               ID;
                     A()
     {
      Prev((CObject*)lastnode);
      A*self = GetPointer(this);
      if(lastnode)
         lastnode.Next(self);
      lastnode=self;
      if(rootnode==NULL)
         rootnode=self;
      ID=ID_counter++;
     }
   static  A*        GetRoot() {return rootnode;}

   virtual void      HighPriorityTask() { Print(__FUNCSIG__," ID=",ID); A* next=(A*)Next(); if(next!=NULL) next.HighPriorityTask(); }
  };
A* A::rootnode=NULL;
A* A::lastnode=NULL;
int A::ID_counter=0;
//+------------------------------------------------------------------+
class B: public base
  {
public:
   virtual void      Task() { Print(__FUNCSIG__); }
  };

//+------------------------------------------------------------------+
void OnStart()
  {
   base *obj[4];;
   obj[0] = new A;
   obj[1] = new A;
   obj[2] = new B;
   obj[3] = new B;
   A* arr[5];
   for(int i=0; i<5; i++)
     {
      arr[i]= new A();
     }
   if(A::GetRoot()!=NULL)
      A::GetRoot().HighPriorityTask();
   for(int i=ArraySize(obj)-1; i>=0; i--)
     {
      //obj[i].HighPriorityTask();
      obj[i].Task();
     }

   for(int i=ArraySize(obj)-1; i>=0; i--)
      delete obj[i];
   for(int i=0; i<5; i++)
     {
      delete arr[i];
     }
  }
//+------------------------------------------------------------------+
 
Dmitry Fedoseev:

А что? Еще один паттерн. Вот только что-то адепты паттернов его не признали, видимо не православный, не канонический.  Почему не реккурсия? Тоже реккурсия, только не вдоль, а поперек. 

это называется "развёртываение цикла" и без всякого OO и шаблонов делается компилятором (по крайней мере должно). 

Если заглянуть в промежуточный код (в ассемблер), то будут просто подряд N операций вместо цикла.

 
Получил неожиданный результат.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

// Простая структура.
struct STRUCT1
{
  int i;  
  double j[2];
};

// Сложная структура.
struct STRUCT2
{
  int i;  
  string Str;
  
  STRUCT2() : Str("1234567 1234567")
  {
  }
};

template <typename T>
int Func( T &Array[] )
{  
  // Write
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    Array[i].i = i;

  int Sum = 0;
  
  // Read
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    Sum += Array[i].i;
    
  return(Sum + ArraySize(Array));    
}

void OnStart()
{
  STRUCT1 Array1[]; // Простая структура.
  STRUCT2 Array2[]; // Сложная структура.
  
  const int Amount = 5e7;
  
  Print(_B(ArrayResize(Array1, Amount), 1));
  Print(_B(ArrayResize(Array2, Amount), 1));
    
  Print(_B(Func(Array1), 1)); // Чтение и запись простой структуры происходит в разы дольше,
  Print(_B(Func(Array2), 1)); // чем сложной.
}


        50000000
        Alert: Time[Test6.mq5 280: ArrayResize(Array2,Amount)] = 640 ms.
        50000000
        Alert: Time[Test6.mq5 282: Func(Array1)] = 440 ms.
        1333106752
        Alert: Time[Test6.mq5 283: Func(Array2)] = 156 ms.
        1333106752
 
fxsaber:
Получил неожиданный результат.


Размеры структур какие через sizeof, а то я не у компа?
 
Vladimir Simakov:
Размеры структур какие через sizeof, а то я не у компа?
        : sizeof(STRUCT1) = 20
        : sizeof(STRUCT2) = 16

Чем больше размер простой структуры, тем медленнее с ней работа.

 
fxsaber:

Чем больше размер простой структуры, тем медленнее с ней работа.

сделайте первую структуру {int;int;double[2]}
 
Vladimir Simakov:
сделайте первую структуру {int;int;double[2]}
        Alert: Time[Test6.mq5 285: Func(Array1)] = 378 ms.
        Alert: Time[Test6.mq5 286: Func(Array2)] = 156 ms.
Выравнивание не при делах. Это сразу проверял.