Ошибки, баги, вопросы - страница 3362

 
Nikolai Semko #:

Видимо преобразование типов (даже bool) весьма затратная штука.

Там не в преобразовании типа проблема. Если правильно написать, то скорость будет, как у while.

время выполнения = 547 , контрольная сумма = 1094470232; цикл while
время выполнения = 547 , контрольная сумма = 1094470232; цикл for(int i = size-1;i>=0;i--)
время выполнения = 549 , контрольная сумма = 1094470232; цикл for(uint i = size;(bool)i--;)
время выполнения = 548 , контрольная сумма = 1094470232; цикл do while
время выполнения = 545 , контрольная сумма = 1094470232; цикл через рекурсию

Не знаю, почему int-вариант тормозит, а uint - нет.

цикл for на ~35% медленнее, чем while

У меня включена оптимизация, запуск release-версии. См. выше.

 
fxsaber #:

Там не в преобразовании типа проблема. Если правильно написать, то скорость будет, как у while.

Не знаю, почему int-вариант тормозит, а uint - нет.

У меня включена оптимизация, запуск release-версии. См. выше.

Да, я уже понял свой косяк. Спасибо.

2023.07.19 17:29:34.908 TestLoopsPerformance (USDJPY,M1)        ========================
2023.07.19 17:29:34.908 TestLoopsPerformance (USDJPY,M1)        время выполнения = 330 , контрольная сумма = 8187742387000; цикл while
2023.07.19 17:29:34.908 TestLoopsPerformance (USDJPY,M1)        время выполнения = 336 , контрольная сумма = 8187742387000; цикл for(uint i = size-1;i>=0;i--)
2023.07.19 17:29:34.908 TestLoopsPerformance (USDJPY,M1)        время выполнения = 513 , контрольная сумма = 8187742387000; цикл for(uint i = size;(bool)i--;)
2023.07.19 17:29:34.908 TestLoopsPerformance (USDJPY,M1)        время выполнения = 511 , контрольная сумма = 8187742387000; цикл do while
2023.07.19 17:29:34.908 TestLoopsPerformance (USDJPY,M1)        время выполнения = 331 , контрольная сумма = 8187742387000; цикл через рекурсию
2023.07.19 17:29:38.440 TestLoopsPerformance (USDJPY,M1)        ========================
2023.07.19 17:29:38.440 TestLoopsPerformance (USDJPY,M1)        время выполнения = 333 , контрольная сумма = 8187157275000; цикл while
2023.07.19 17:29:38.440 TestLoopsPerformance (USDJPY,M1)        время выполнения = 332 , контрольная сумма = 8187157275000; цикл for(uint i = size-1;i>=0;i--)
2023.07.19 17:29:38.440 TestLoopsPerformance (USDJPY,M1)        время выполнения = 517 , контрольная сумма = 8187157275000; цикл for(uint i = size;(bool)i--;)
2023.07.19 17:29:38.440 TestLoopsPerformance (USDJPY,M1)        время выполнения = 517 , контрольная сумма = 8187157275000; цикл do while
2023.07.19 17:29:38.440 TestLoopsPerformance (USDJPY,M1)        время выполнения = 330 , контрольная сумма = 8187157275000; цикл через рекурсию
2023.07.19 17:29:41.713 TestLoopsPerformance (USDJPY,M1)        ========================
2023.07.19 17:29:41.713 TestLoopsPerformance (USDJPY,M1)        время выполнения = 335 , контрольная сумма = 8195795129500; цикл while
2023.07.19 17:29:41.713 TestLoopsPerformance (USDJPY,M1)        время выполнения = 337 , контрольная сумма = 8195795129500; цикл for(uint i = size-1;i>=0;i--)
2023.07.19 17:29:41.713 TestLoopsPerformance (USDJPY,M1)        время выполнения = 522 , контрольная сумма = 8195795129500; цикл for(uint i = size;(bool)i--;)
2023.07.19 17:29:41.713 TestLoopsPerformance (USDJPY,M1)        время выполнения = 519 , контрольная сумма = 8195795129500; цикл do while
2023.07.19 17:29:41.713 TestLoopsPerformance (USDJPY,M1)        время выполнения = 335 , контрольная сумма = 8195795129500; цикл через рекурсию

но на моем процессоре все равно  с bool() медленее примерно в полтора раза. 
Так же включена максимальная оптимизация.
Но на цикл for я зря гнал. А вот do while тоже отстает на 50% на моем процессоре. 
Подозреваю, что действительно сильно от железа зависят все эти оптимизации. 

#define size 1000000
#define total_tests 500
//+------------------------------------------------------------------+
void OnStart() {
   ulong sum1=0,sum2=0, sum3=0, sum4=0, sum5=0;
   ulong t1=0, t2=0, t3=0, t4=0, t5=0;
   uint X[];
   ArrayResize(X,size);
   for(uint i=0; i<size; i++) X[i]=rand();
   
   for (uint j = 0; j++<total_tests;) {
      ulong t=GetMicrosecondCount();
      uint i1=0;
      while(i1<size) sum1+=X[i1++];
      t1+=GetMicrosecondCount()-t;

      t=GetMicrosecondCount();
      for(uint i = 0; i<size;i++) sum4+=X[i];
      t4+=GetMicrosecondCount()-t;

      t=GetMicrosecondCount();
      for(uint i = size; (bool)i--;) sum3+=X[i];
      t3+=GetMicrosecondCount()-t;

      t=GetMicrosecondCount();
      uint i2=size-1;
      do sum5+=X[i2];
      while(i2--!=0);
      t5+=GetMicrosecondCount()-t;

      t=GetMicrosecondCount();
      int i3=0;
      Recursion(X,sum2,i3);
      t2+=GetMicrosecondCount()-t;
   }

   Print("========================");
   Print("время выполнения = "+string(t1/total_tests)+" , контрольная сумма = "+string(sum1) + "; цикл while");
   Print("время выполнения = "+string(t4/total_tests)+" , контрольная сумма = "+string(sum4) + "; цикл for(uint i = size-1;i>=0;i--)");
   Print("время выполнения = "+string(t3/total_tests)+" , контрольная сумма = "+string(sum3) + "; цикл for(uint i = size;(bool)i--;)");
   Print("время выполнения = "+string(t5/total_tests)+" , контрольная сумма = "+string(sum5) + "; цикл do while");
   Print("время выполнения = "+string(t2/total_tests)+" , контрольная сумма = "+string(sum2) + "; цикл через рекурсию");
}
//+------------------------------------------------------------------+
void Recursion(uint &X[],ulong &sum, uint &i) {
   sum+=X[i];
   i++;
   if(i<size) Recursion(X,sum,i);
}
//+------------------------------------------------------------------+
 

Мои результаты:

2023.07.20 20:13:59.028 TestLoopsPerformance__1 (EURUSD,H1)     время выполнения = 558, контрольная сумма = 8194189180500, цикл while
2023.07.20 20:13:59.028 TestLoopsPerformance__1 (EURUSD,H1)     время выполнения = 578, контрольная сумма = 8194189180500, цикл for(uint i = size-1;i>=0;i--)
2023.07.20 20:13:59.028 TestLoopsPerformance__1 (EURUSD,H1)     время выполнения = 593, контрольная сумма = 8194189180500, цикл for(uint i = size;(bool)i--;)
2023.07.20 20:13:59.028 TestLoopsPerformance__1 (EURUSD,H1)     время выполнения = 600, контрольная сумма = 8194189180500, цикл do while
2023.07.20 20:13:59.028 TestLoopsPerformance__1 (EURUSD,H1)     время выполнения = 548, контрольная сумма = 8194189180500, цикл через рекурсию
2023.07.20 20:14:16.919 TestLoopsPerformance__1 (EURUSD,H1)     ========================
2023.07.20 20:14:16.919 TestLoopsPerformance__1 (EURUSD,H1)     время выполнения = 568, контрольная сумма = 8196256892000, цикл while
2023.07.20 20:14:16.919 TestLoopsPerformance__1 (EURUSD,H1)     время выполнения = 580, контрольная сумма = 8196256892000, цикл for(uint i = size-1;i>=0;i--)
2023.07.20 20:14:16.919 TestLoopsPerformance__1 (EURUSD,H1)     время выполнения = 598, контрольная сумма = 8196256892000, цикл for(uint i = size;(bool)i--;)
2023.07.20 20:14:16.919 TestLoopsPerformance__1 (EURUSD,H1)     время выполнения = 604, контрольная сумма = 8196256892000, цикл do while
2023.07.20 20:14:16.919 TestLoopsPerformance__1 (EURUSD,H1)     время выполнения = 561, контрольная сумма = 8196256892000, цикл через рекурсию
2023.07.20 20:14:19.796 TestLoopsPerformance__1 (EURUSD,H1)     ========================
2023.07.20 20:14:19.796 TestLoopsPerformance__1 (EURUSD,H1)     время выполнения = 575, контрольная сумма = 8187187545500, цикл while
2023.07.20 20:14:19.796 TestLoopsPerformance__1 (EURUSD,H1)     время выполнения = 598, контрольная сумма = 8187187545500, цикл for(uint i = size-1;i>=0;i--)
2023.07.20 20:14:19.796 TestLoopsPerformance__1 (EURUSD,H1)     время выполнения = 610, контрольная сумма = 8187187545500, цикл for(uint i = size;(bool)i--;)
2023.07.20 20:14:19.796 TestLoopsPerformance__1 (EURUSD,H1)     время выполнения = 619, контрольная сумма = 8187187545500, цикл do while
2023.07.20 20:14:19.796 TestLoopsPerformance__1 (EURUSD,H1)     время выполнения = 567, контрольная сумма = 8187187545500, цикл через рекурсию
 

Огромная просьба к разработчикам:

Нововведение: пожалуйста, сделайте шапку окна тестера в визуальном режиме иным цветом, чем цвет шапки самого терминала.

Обоснование: очень часто по ошибке нажимая кнопку "X" окна закрывается окно терминала, а не тестера в визуальном режиме.

Или, как вариант, задавать вопрос в всплывающем окне при закрытии терминала "Вы точно уверены, что хотите закрыть терминал? Посмотрите, у Вас вот советники запущены, и много чего другого очень важного делается а Вы хотите закрыть терминал. Подумайте ещё раз. Вы точно уверены, что хотите закрыть терминал?", а всплывающее окно должно быть с каким нибудь очень страшным предупреждающим знаком.

Закрытие терминала должно быть осознанным шагом во многих случаях.

 
Andrey Dik #:

Огромная просьба к разработчикам:

Нововведение: пожалуйста, сделайте шапку окна тестера в визуальном режиме иным цветом, чем цвет шапки самого терминала.

Обоснование: очень часто по ошибке нажимая кнопку "X" окна закрывается окно терминала, а не тестера в визуальном режиме.

Или, как вариант, задавать вопрос в всплывающем окне при закрытии терминала "Вы точно уверены, что хотите закрыть терминал? Посмотрите, у Вас вот советники запущены, и много чего другого очень важного делается а Вы хотите закрыть терминал. Подумайте ещё раз. Вы точно уверены, что хотите закрыть терминал?", а всплывающее окно должно быть с каким нибудь очень страшным предупреждающим знаком.

Закрытие терминала должно быть осознанным шагом во многих случаях.

Андрей, вместо того чтобы приучить себя к внимательности вы пытаетесь напрячь разработчиков и устроить проблему большинству пользователей терминалом. Лично мне это не только не надо, а меня бесит такая проверка. Ведь если утрировать, то получается такое предупреждение можно произнести так: «Ты идиот, сам не понимаешь что творишь, ты уверен, что с ума не сошёл…» и всё в том-же духе. Не принимайте это в свой адрес… А потом найдётся такой который будет тыкать не думая два раз подряд и запросит два подтверждения и больше.


И ещё, разве у вас маленький монитор? Разве обязательно окно должно быть развёрнуто во весь экран? У меня всего 27 дюймов и ни одно окно не развёрнуто во весь экран при моём старческом зрении.

 
да вполне нормально, выделить тестер другим цветом. И жутко бесит, что он всегда Не полноэкранным открывается, какой в этом смысл?
 
lynxntech #:
да вполне нормально, выделить тестер другим цветом. И жутко бесит, что он всегда Не полноэкранным открывается, какой в этом смысл?

Это споры о вкусах.

 
lynxntech #:
да вполне нормально, выделить тестер другим цветом. И жутко бесит, что он всегда Не полноэкранным открывается, какой в этом смысл?

Больше бесит не внешний вид окон, а многолетний игнор проблемы с ошибкой [рынок закрыт]. Почему-то при открытии позиции\ордера эта ошибка есть, а при проверке OrderChecl() её нет.

 
Artyom Trishkin #:

Это споры о вкусах.

О вкусах не спорят. Все фломастеры на вкус одинаковые. Только по цвету отличаются.

 
Alexey Viktorov #:

Больше бесит не внешний вид окон, а многолетний игнор проблемы с ошибкой [рынок закрыт]. Почему-то при открытии позиции\ордера эта ошибка есть, а при проверке OrderChecl() её нет.

Потому что для OrderCheck неизвестно, когда будет сделан OrderSend. Например, OrderCheck должен работать на выходных.

Причина обращения: