Новая версия платформы MetaTrader 5 build 3500: улучшения и исправления - страница 4

 
Azat смотрите пожалуйста кнопку "код" для вставки, что-бы он выглядел как в редакторе
 
fxsaber #:


Как оказалось, компилятор не только выполняет оператор присваивания, но еще и на каждой итерации создает объект. "Что вижу, то и пою". Вот и задаюсь вопросом, где оптимизация компилятором?

Да любой компилятор в этом случае(если код будет именно в таком виде), так и сделает.

Меня удивляет что вас это удивляет

 
lynxntech #:
Azat смотрите пожалуйста кнопку "код" для вставки, что-бы он выглядел как в редакторе

Спасибо большое!

Переделал

 
Azat #:

Просто наблюдение..

1. -nan. Time: 141
2. -nan. Time: 315
3. -nan. Time: 140

Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 68 in OnStart: GetSum1(Array,1,2,3)] = 6592 mcs.
Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 69 in OnStart: GetSum2(Array,1,2,3)] = 303566 mcs.
Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 70 in OnStart: GetSum3(Array,1,2,3)] = 7191 mcs.

По какой-то причине первый и третий вариант после переписывания стал выполняться в 20 раз медленнее. В упор не вижу причину замедления. Не хочется верить, что компилятор вытворил такое.

 
Azat #:

Да любой компилятор в этом случае(если код будет именно в таком виде), так и сделает.

Меня удивляет что вас это удивляет

Не программист. Исходил из логики целесообразности/эффективности.

 
fxsaber #:

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

процессорный кэш? есть у RAM кэш, например приложение simpletv, размер около 600мб, стоит на слабом винте -помойка 2,5 sata II, после рестарта windows загружается реально долго, пол минуты, но стоит запустить разок и даже после 6 часов он загружается моментально,

в windows стоит 50мб виртуальной памяти, для работы служб

windows 10, 64gb RAM, Ryzen 5700x

 
fxsaber #:

Не программист. Исходил из логики целесообразности/эффективности.

Если бы мне пришлось писать ваши подсчеты сумм, то сделал бы через ООП, конечно.

Но если совсем по-быстрому, то вот так скорее всего:


struct MqlTradeRequestExt : MqlTradeRequest {
   
   public: double getSum(const double Koef1, const double Koef2, const double Koef3) {
      return this.price * Koef1 + this.tp * Koef2 + this.sl * Koef3;
   }
};


double GetSum4( const STRUCT &Array[], const double Koef1, const double Koef2, const double Koef3 )
{
  double Sum = 0;
  
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    for (int j = ArraySize(Array[i].Request) - 1; j >= 0; j--)
      Sum += Array[i].Request[j].getSum(Koef1, Koef2, Koef3);
      
  return(Sum);
}


Производительность как у третьего, но читать чуть легче(мне).

 
Azat #:

Если бы мне пришлось писать ваши подсчеты сумм, то сделал бы через ООП, конечно.

Но если совсем по-быстрому, то вот так скорее всего:

Производительность как у третьего, но читать чуть легче(мне).

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

 
fxsaber #:

По какой-то причине первый и третий вариант после переписывания стал выполняться в 20 раз медленнее. В упор не вижу причину замедления. Не хочется верить, что компилятор вытворил такое.

Нашел - не принтовался результат выполнения функции, поэтому оптимизатор (он есть!) компилятора выкидывал то, что использоваться все равно не будет. Исправил исходник. Второй вариант все равно аутсайдер.

В общем, вывод такой, что в компиляторе оптимизатор есть, но вот с такой простой задачей не справляется.


Рекомендую проверить наличие в своих исходниках "второго варианта" (или, что еще хуже, "четвертого") и устранить его. Как быстро проверить - непонятно.

 

Const модификаторы в C/С++ подобных языках сделаны для контроля случайных модификаций программистами + по мелочи.

В оптимизации кода практически нулевое влияние. Тем более на современных C++ компиляторах, которые и без программиста прилично вычисляют изменяемость переменных.