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

 
Igor Makanu:

нет

если будут повторяющиеся участки кода - получите тестирование оптимизации!

какая разница сколько выполняется rand() ?

да пусть он выполняется 2/3 времени теста, главное чтобы время выполеения rand() было постоянным

ну и имхо, переключать контекст на выполнение системных функцций нужно, Ваш же MQL код будет использовать системные MQL-функции? - смысл идеальный код тестить?

)) разница в скорости могла быть в 4 раза в пользу одно из способов (1 к 4), но т.к. операция rand раз в 10 больше по времени чем остальной код этой разницы бы не было видно (11 к 14)

 
Alexandr Andreev:

)) разница в скорости могла быть в 4 раза в пользу одно из способов (1 к 4), но т.к. операция rand раз в 10 больше по времени чем остальной код этой разницы бы не было видно (11 к 14)

нет не могла

разница сразу видна

проверим, что-нибудь, что объявляли разработчики в новшествах, часто пишут, что время доступа к таймесериям для какой-нибудь функции было оптимизировано = давно не проверял

#define   SpeedTest(count_x10,msg,EX)        {ulong mss=GetMicrosecondCount(); ulong count=(ulong)pow(10,count_x10);for(ulong _i=0;_i<count&&!_StopFlag;_i++){EX;} \
//+------------------------------------------------------------------+
void OnStart()
{
   double sum1 = 0.0;
   SpeedTest(7, "tst 1 : ",
   {
      sum1 += iOpen(NULL, 0, rand());
   });
//--
   double sum2 = 0.0;
   SpeedTest(7, "tst 2 : ",
   {
      double o[];
      CopyOpen(NULL, 0, rand(), 1, o);
      sum2 += o[0];
   });
   Print(sum1, " : ", sum2);
}
//+------------------------------------------------------------------+

2020.10.16 02:11:20.671 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000 ms=353174

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) tst 2 : : loops=10000000 ms=1296043

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) 11304533.15558525 : 11303930.69247558

2020.10.16 02:11:44.012 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000 ms=359757

2020.10.16 02:11:45.369 SpeedTst (EURUSD,H1) tst 2 : : loops=10000000 ms=1357325

2020.10.16 02:11:45.369 SpeedTst (EURUSD,H1) 11304350.05612442 : 11304321.21848488

 
Igor Makanu:

вообще некритично

время выполнения rand() постоянное, скорее всего это обычная С++ функция , гуглится "rand c++ source code"

инициализировать обязательно нужно, но если инициализировать константами, можно нарваться на оптимизацию

в общем не понятна нелюбовь к rand()

как вариант инициализироваться чем-нибудь таким:

будет быстро


запустил Ваш скрипт, имхо не правильно

основное время это загрузка кода в кэш и затем в процессор

ну и добавим дискретность системного таймера

получим... почти случайное число

долго тестировать нужно, примерно 100500 раз, имхо

rand() зашумляет результат. 
На моем компе одна итерация цикла занимает около полутора наносекунд. 

С двумя rand() одна итерация увеличивается в два раза - почти до 3 наносекунд. При этом нужно понимать что в такой итерации изчезает два раза доступ к элементу большого массива, что тоже достаточно дорого.
Значит можно предположить, что на два rand() тратится около 2/3 всего времени итерации. Я конечно погорячился насчет "на порядок" ))

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

Уже как-то речь шла о производительности rand(). Я даже попытался сам написать подобную функцию. https://www.mql5.com/ru/forum/170952/page137#comment_12010041

#define Num 10000000
#define SpeedTest(msg,s,EX)  {ulong mss=GetMicrosecondCount(); EX \
                                    mss=GetMicrosecondCount()-mss;\
                                    printf("%-30s%llu µs; Сумма - %llu",msg,mss,s);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong sum = 0;
   ushort in[];
   ArrayResize(in,Num*2);
   for (int i=0; i<Num*2; i++) in[i] = (ushort)rand();
   SpeedTest("test binary shift : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      sum+=in[i]<<(sizeof(ushort)*8) | in[i+1];
   });
//+------------------------------------------------------------------+ 
   sum = 0;
   union ushortTouint
   {
      uint param;
      ushort in[2];
   } u;
   SpeedTest("test union : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      u.in[0]=in[i+1];
      u.in[1]=in[i];
      sum+=u.param;
   });
//+------------------------------------------------------------------+   
   sum=0;
   SpeedTest("test binary shift + rand() : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      sum+=(ushort)rand()<<(sizeof(ushort)*8) | (ushort)rand();
   });
//+------------------------------------------------------------------+  
   sum = 0;
   SpeedTest("test union + rand() : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      u.in[0]=(ushort)rand();
      u.in[1]=(ushort)rand();
      sum+=u.param;
   });
}

результат

2020.10.15 18:30:34.752 TestMakanu (USDCAD,M1)  test binary shift :           13474 µs; Сумма - 10736778112806491
2020.10.15 18:30:34.763 TestMakanu (USDCAD,M1)  test union :                  10189 µs; Сумма - 10736778112806491
2020.10.15 18:30:34.792 TestMakanu (USDCAD,M1)  test binary shift + rand() :  29103 µs; Сумма - 10741215942967312
2020.10.15 18:30:34.820 TestMakanu (USDCAD,M1)  test union + rand() :         28125 µs; Сумма - 10737655794873175
2020.10.15 18:30:37.802 TestMakanu (USDCAD,M1)  test binary shift :           11144 µs; Сумма - 10739125609966082
2020.10.15 18:30:37.812 TestMakanu (USDCAD,M1)  test union :                  10334 µs; Сумма - 10739125609966082
2020.10.15 18:30:37.840 TestMakanu (USDCAD,M1)  test binary shift + rand() :  27495 µs; Сумма - 10739749025492645
2020.10.15 18:30:37.867 TestMakanu (USDCAD,M1)  test union + rand() :         26782 µs; Сумма - 10738717766184542
2020.10.15 18:30:40.356 TestMakanu (USDCAD,M1)  test binary shift :           10618 µs; Сумма - 10738510882058397
2020.10.15 18:30:40.367 TestMakanu (USDCAD,M1)  test union :                  11354 µs; Сумма - 10738510882058397
2020.10.15 18:30:40.395 TestMakanu (USDCAD,M1)  test binary shift + rand() :  27637 µs; Сумма - 10738670876702722
2020.10.15 18:30:40.422 TestMakanu (USDCAD,M1)  test union + rand() :         26772 µs; Сумма - 10737441784096963
 

Думаю итог таков, что почти без разницы чем пользоваться - union или через бинарный сдвиг. 
Я в своей библиотеке iCanvas использую оба этих метода для работы с цветом. 

union argb {
   uint clr;
   uchar c[4];
};


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

 
Nikolai Semko:

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

выше 2 ссылки на хабр давал, в первой статье хорошо показано как обычный цикл  выглядит после компиляции

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


Nikolai Semko:

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

да, так и есть, я буду сдвиг использовать, код читаемый, да и не нужно новый тип данных вводить - union
 
Igor Makanu:

выше 2 ссылки на хабр давал, в первой статье хорошо показано как обычный цикл  выглядит после компиляции

я не утверждаю, что обязательно можно попасть на оптимизацию выполнения, но имхо, если массив не изменяется, что по сути является для цикла константной областью памяти с константным размером, не факт, что не всплывет какая оптимизация

судя по результатам никакой оптимизацией не пахнет

 
Nikolai Semko:

судя по результатам никакой оптимизацией не пахнет

да

спор то не в конкретном коде

а в самой методике тестирования, я пока придерживаюсь, что тестирую оптимально, и rand() хоть и вносит искажения, но это линейный коэффициент,  а не пропорциональный, т.е. точность по сути не сильно важна если нет отличий по скорости менее 5%, имхо

 
Уважаемые, ну хоть кто-нибудь хоть что-нибудь может ответить по непонятной для меня ситуации?
 

Всем, привет!

У меня вопрос, наверное к разработчика MQL5? может быть кто-то  еще в курсе... Планируется ли интеграция компилятора/редактора кода ME с какими-нибудь популярными средами разработки типа IDEA или Visual Studio? Для меня Meta Editor это большая боль. Сворачивания блоков нет, автоподстановки шаблонов нет (типа начинаешь набирать for(... а он тебе сразу предлагает шаблон цикла подставить и многое другое), подсветки всяких важных кусков нормальной нет. И так далее и тому подобное. Не говорю, про то, что современные роботы сложны, это большие проекты и возникают существенно более серьезные требования к управлению кодом и к возможности коллективной разработки. 

Никто уже не пишет свои редакторы и компиляторы, все от них отказываются и переходят на готовые решения от Microsoft, JetBrains и др. Все современные редакторы имеют системы настраиваемых плагинов, которые  позволяют туда прикрутить все что угодно.  Задача-то не сложная в принципе.

 
Сергей Таболин:
Уважаемые, ну хоть кто-нибудь хоть что-нибудь может ответить по непонятной для меня ситуации?

А ты еще больше позадирай программистов. Тогда точно помогут

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