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

 
Igor Makanu:

если написать такие классы:

судя по Вашему исследованию класс В будет медленнее выполняться если часто использовать поля структуры при расчетах? 

Так-то обсуждалось время обхода массива объектов)))

По Вашему примеру в плюсах одинаково будет, а вот в mql - нюанс, тут есть два неявных поля, которые первыми идут, поэтому, к полю data, обращение пойдет по смещению, то есть дополнительные вычисления при разыменовании будут.

 
Vladimir Simakov:

Так-то обсуждалось время обхода массива объектов)))

По Вашему примеру в плюсах одинаково будет, а вот в mql - нюанс, тут есть два неявных поля, которые первыми идут, поэтому, к полю data, обращение пойдет по смещению, то есть дополнительные вычисления при разыменовании будут.

Спасибо, это полезно!

 
Vladimir Simakov:

Так-то обсуждалось время обхода массива объектов)))

По Вашему примеру в плюсах одинаково будет, а вот в mql - нюанс, тут есть два неявных поля, которые первыми идут, поэтому, к полю data, обращение пойдет по смещению, то есть дополнительные вычисления при разыменовании будут.

Оба класса аналогичны. Доступ идёт по смещению в обоих случаях, только не относительно начала структуры, а относительно начала класса.  Т.е. структура сама по себе невесома.  Оверхед создают лишь классы.
 
Vladimir Simakov:

Так, что никакой мистики - законы физики в действии.

Не укладывается в "законы физики".

#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

long f1( const int Size, const long Amount = 5e9 )
{
  long Sum = 0;
  
  for (long i = 0; i < Amount; i++)
  {
    Sum += Size * i;
    
    Sum |= 1;
  }
    
  return(Sum);
}

long f2( const int Size, const long Amount = 5e9 )
{
  long Sum = 0;
  
  for (long i = 0; i < Amount; i++)
  {
    Sum += Size * (Amount - i);
    
    Sum |= 1;
  }
    
  return(Sum);
}

void OnStart()
{
  Print(_B(f1(2), 1));
  Print(_B(f1(200), 1));
  
  Print(_B(f2(2), 1));
  Print(_B(f2(200), 1));
}


        Alert: Time[Test6.mq5 267: f1(2)] = 3252 ms.
        6553255921290448385
        Alert: Time[Test6.mq5 268: f1(200)] = 4602 ms.
        -8757194524499019775
        Alert: Time[Test6.mq5 270: f2(2)] = 3061 ms.
        6553255931290448385
        Alert: Time[Test6.mq5 271: f2(200)] = 3112 ms.
        -8757193524499019775


Парадоксальный результат получился. Более сложные вычисления производятся в 1.5 раза быстрее и не зависят от размера.

 
Vladimir Simakov:

Так-то обсуждалось время обхода массива объектов)))

По Вашему примеру в плюсах одинаково будет, а вот в mql - нюанс, тут есть два неявных поля, которые первыми идут, поэтому, к полю data, обращение пойдет по смещению, то есть дополнительные вычисления при разыменовании будут.

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

 
Roman:

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

На форуме завелся какой-то троль...
Раньше не понимал зачем некоторые пользователи просят ввести функцию игнора, ах как ее теперь не хватает...

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы по ООП в MQL5

fxsaber, 2020.05.30 14:06

Даже возиться не хочу. Сделал простые структуры.

        50000000
        50000000
        Alert: Time[Test6.mq5 280: Func(Array1)] = 312 ms.
        1333106752
        Alert: Time[Test6.mq5 281: Func(Array3)] = 1348 ms.
        1333106752
        : sizeof(STRUCT1) = 20
        : sizeof(STRUCT3) = 84

По какой причине доступ к первому полю простой структуры зависит от ее размера - не понятно.

Вы используете 50М элементов в массиве.
Для структур размером 20 и 84 байт - это соответственно 0.93 ГБ и  3.91 ГБ данных.
И в рамка вашего расчета, предположительно, вся эта память пройдет через кеш процесора.
И весьма логичным объяснением полученных результатов может быть то, что данные размером  0.93 ГБ загрузится из памяти в кеш процессора в четыре разы быстрее, чем данные размером 3.91 ГБ.

А что там с результатами теста на С++?
А то ассемблеровский код видел, а результатов тестов - нет, или плохо смотрел?
 
Sergey Dzyublik:

На форуме завелся какой-то троль...
Раньше не понимал зачем некоторые пользователи просят ввести функцию игнора, ах как ее теперь не хватает...

Ты бы за собой следил, а не за другими.
Не тебе и не для тебя был ответ.
Игнорируй молча ))

 
Sergey Dzyublik:
Вы используете 50М элементов в массиве.
Для структур размером 20 и 84 байт - это соответственно 0.93 ГБ и  3.91 ГБ данных.
И в рамка вашего расчета, предположительно, вся эта память пройдет через кеш процесора.
И весьма логичным объяснением полученных результатов может быть то, что данные размером  0.93 ГБ загрузится из памяти в кеш процессора в четыре разы быстрее, чем данные размером 3.91 ГБ.

А что там с результатами теста на С++?
А то ассемблеровский код видел, а результатов тестов - нет, или плохо смотрел?
аналогично получается. Побыстрее только чутка, а так, соотношение то же, так, что аппаратное это.
 
Roman:

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

Структуру вместо класса можно, с ними все норм.