вопрос к знатокам #define - страница 5

 
Alexandr Andreev:

Давайте полный код своего теста

держите, но использование rand() не вижу смысла еще раз обсуждать, как вариант замените на некую переменную inc++ 

#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;} \
                                              printf("%s: loops = %llu seconds=%.4f",msg,count,(double)(GetTickCount()-mss)/1000000.0);}



//+------------------------------------------------------------------+
void OnStart()
{
   int arr1[], arr2[], arr3[];
   int cnt1 = ArrayResize(arr1, 100);
   int cnt2 = ArrayResize(arr2, 200);
   int cnt3 = ArrayResize(arr3, 300);
   ulong sum = 0;

   SpeedTest(3,"ArraySize",
      for(int i = 0; i < ArraySize(arr1); i++)
      {
         for(int j = 0; j < ArraySize(arr2); j++)
         {
            for(int k = 0; k < ArraySize(arr3); k++)
            {
               arr3[k] = rand();
               sum += arr3[k];
            }
            arr2[j] = rand();
            sum += arr2[j];
         }
         arr1[i] = rand();
         sum += arr1[i];
      }
   )
   
   SpeedTest(3,"cnt",
      for(int i = 0; i < cnt1; i++)
      {
         for(int j = 0; j < cnt2; j++)
         {
            for(int k = 0; k < cnt3; k++)
            {
               arr3[k] = rand();
               sum += arr3[k];
            }
            arr2[j] = rand();
            sum += arr2[j];
         }
         arr1[i] = rand();
         sum += arr1[i];
      }
   )

}


да... ошибка какая то у меня в коде,  время в секундах хочу выводить, а получаю в 10 раз больше, разделил вроде правильно на 1 000 000, кто может подсказать в чем причина?

 
Igor Makanu:

держите, но использование rand() не вижу смысла еще раз обсуждать, как вариант замените на некую переменную inc++ 


да... ошибка какая то у меня в коде,  время в секундах хочу выводить, а получаю в 10 раз больше, разделил вроде правильно на 1 000 000, кто может подсказать в чем причина?

ПРОСТО БОМБА

вот ваш код который доказывает наоборот

//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#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;} \
                                              printf("%s: loops = %llu seconds=%.4f",msg,count,(double)(GetTickCount()-mss)/1000000.0);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void OnStart()
{
   int arr1[], arr2[], arr3[];
   int cnt1 = ArrayResize(arr1, 100);
   int cnt2 = ArrayResize(arr2, 200);
   int cnt3 = ArrayResize(arr3, 300);
   ulong sum = 0;

   
   SpeedTest(3,"cnt",
      for(int i = 0; i < cnt1; i++)
      {
         for(int j = 0; j < cnt2; j++)
         {
            for(int k = 0; k < cnt3; k++)
            {
               arr3[k] = rand();
               sum += arr3[k];
            }
            arr2[j] = rand();
            sum += arr2[j];
         }
         arr1[i] = rand();
         sum += arr1[i];
      }
   )

   SpeedTest(3,"ArraySize",
      for(int i = 0; i < ArraySize(arr1); i++)
      {
         for(int j = 0; j < ArraySize(arr2); j++)
         {
            for(int k = 0; k < ArraySize(arr3); k++)
            {
               arr3[k] = rand();
               sum += arr3[k];
            }
            arr2[j] = rand();
            sum += arr2[j];
         }
         arr1[i] = rand();
         sum += arr1[i];
      }
   )
}
 
Alexandr Andreev:

ПРОСТО БОМБА

вот ваш код который доказывает наоборот

я просто проверки поменял местами

 
Alexandr Andreev:

я просто проверки поменял местами

2020.11.02 21:01:38.590 22222 (USDCHF,H1) cnt: loops = 1000 seconds=821.7159

2020.11.02 21:01:52.353 22222 (USDCHF,H1) ArraySize: loops = 1000 seconds=807.9415


Исходя из этого получается что  ArraySize быстрее чем использование переменной =))) что-то не так с тестом
 
Roman:

Да какой тест?  ))
Вы сами показали оба варианта условия цикла.
Игорь выше тоже код привёл.
Просто замерьте выполнение цикла с переменной size и с ArraySize() в условии цикла.

дак докажите мне обратное)

а то у меня в тесте почему-то они одинаковые

 
Alexandr Andreev:

я просто проверки поменял местами

да это нужно делать

в этот раз поленился

обернул тесты во внешний цикл, получил так:

2020.11.02 22:06:43.557 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=117.4626

2020.11.02 22:06:58.328 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=102.7337

2020.11.02 22:07:13.075 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=87.9782

2020.11.02 22:07:27.850 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=73.2461

2020.11.02 22:07:42.598 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=58.4859

2020.11.02 22:07:57.380 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=43.7522

2020.11.02 22:08:12.891 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=28.9861

2020.11.02 22:08:28.874 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=13.4910

 
Igor Makanu:

да это нужно делать

в этот раз поленился

обернул тесты во внешний цикл, получил так:

2020.11.02 22:06:43.557 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=117.4626

2020.11.02 22:06:58.328 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=102.7337

2020.11.02 22:07:13.075 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=87.9782

2020.11.02 22:07:27.850 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=73.2461

2020.11.02 22:07:42.598 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=58.4859

2020.11.02 22:07:57.380 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=43.7522

2020.11.02 22:08:12.891 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=28.9861

2020.11.02 22:08:28.874 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=13.4910

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

 
Alexandr Andreev:

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

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

но, имхо, во вложенных циклах, все равно не стоит вызывать ArraySize() без необходимости, проще, да и привык уже обратный цикл использовать

for(int i = ArraySize(arr)-1; i >=0 ; i--)

понятное дело, что иногда неудобно, тогда через временную переменную делаю цикл - Ваш вариант №2

имхо, это надежно и понимаешь, что будет происходить

 

Ну против ИМХО я ничего не могу сказать.

У меня на очень больших повторах победа стала случайной у первого и второго способа... скорее всего стало зависит от кэша проца на текущий момент и общей загрузки.

Вопрос был не касаемо цикла - а касаемо разворачивания функции. Просто в качестве примера был ArraySizeтут

Итог;

for (int i=0; i<ArraySIze(mas); i++)  ==  for (int i=0; i<size; i++)


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

 

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

так код измените:

for(int loop=0; loop <5;loop++)
   {
   int cnt1 = ArrayResize(arr1, 100+loop);
   int cnt2 = ArrayResize(arr2, 200+loop);
   int cnt3 = ArrayResize(arr3, 300+loop);
   
   SpeedTest(3,"cnt",
.....

Alexandr Andreev:

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

не выходит

runtime оптимизация  в лидерах будет

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