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

 
Igor Makanu:

какой вариант преобразований будет быстрее работать при оптимизации

Это же будет вызывать только один раз на весь проход. Поэтому без разницы.

 
fxsaber:

Это же будет вызывать только один раз на весь проход. Поэтому без разницы.

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

 
Igor Makanu:

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

union это не копирование в массивы, это разная интерпретация того же участка памяти. так что скорее всего 2-й вариант быстрее, но, как заметили выше, это неважно.
 
TheXpert:
union это не копирование в массивы, это разная интерпретация того же участка памяти. так что скорее всего 2-й вариант быстрее, но, как заметили выше, это неважно.
Юнион не так быстр, как кажется. К сожалению. 
Ставлю на первый.
 
Igor Makanu:

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

есть старый способ измерение скорости

в стиле

for (int i=0; i< 1000000; i++) {наш код1}.... 
for (int i=0; i< 1000000; i++) {наш код2}.... 

 
Nikolai Semko:
Юнион не так быстр, как кажется. Ставлю на первый.

тоже ставлю на первый! бинайрные операторы быстрее оператора if в разы, хотя во втором его и нету

 

проверил:

#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 ms=%llu",msg,count,GetMicrosecondCount()-mss);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong sum = 0;
   SpeedTest(10, "tst 1 : ",
   {
      ushort in01A = (ushort)rand();
      ushort in01B = (ushort)rand();
      ushort in02A = (ushort)rand();
      ushort in02B = (ushort)rand();
      ushort in03A = (ushort)rand();
      ushort in03B = (ushort)rand();
      ushort in04A = (ushort)rand();
      ushort in04B = (ushort)rand();
      ushort in05A = (ushort)rand();
      ushort in05B = (ushort)rand();
      uint param[5];
      param[0] = (uint)in01A << (sizeof(ushort) * 8) | in01B;
      param[1] = (uint)in02A << (sizeof(ushort) * 8) | in02B;
      param[2] = (uint)in03A << (sizeof(ushort) * 8) | in03B;
      param[3] = (uint)in04A << (sizeof(ushort) * 8) | in04B;
      param[4] = (uint)in05A << (sizeof(ushort) * 8) | in05B;
      for(int i = 0; i < 5; i++) sum += param[i];
   });
//--   
   sum = 0;
   union ushortTouint
   {
      uint param[5];
      ushort in[10];
   }U;
   SpeedTest(10, "tst 2 : ",
   {
      ushort in00 = (ushort)rand();
      ushort in01 = (ushort)rand();
      ushort in02 = (ushort)rand();
      ushort in03 = (ushort)rand();
      ushort in04 = (ushort)rand();
      ushort in05 = (ushort)rand();
      ushort in06 = (ushort)rand();
      ushort in07 = (ushort)rand();
      ushort in08 = (ushort)rand();
      ushort in09 = (ushort)rand();
      ushortTouint u;
      u.in[0] = in00;
      u.in[1] = in01;
      u.in[2] = in02;
      u.in[3] = in03;
      u.in[4] = in04;
      u.in[5] = in05;
      u.in[6] = in06;
      u.in[7] = in07;
      u.in[8] = in08;
      u.in[9] = in09;
      for(int i = 0; i < 5; i++) sum += u.param[i];
   });

}

2020.10.15 21:48:01.401 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000000 ms=10864370

2020.10.15 21:48:12.264 SpeedTst (EURUSD,H1) tst 2 : : loops=10000000000 ms=10862287

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

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

 
Igor Makanu:

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

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

 
Igor Makanu:

проверил:

2020.10.15 21:48:01.401 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000000 ms=10864370

2020.10.15 21:48:12.264 SpeedTst (EURUSD,H1) tst 2 : : loops=10000000000 ms=10862287

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

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

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

А нужный нам код в таком количестве повторений у меня занимает 0 ms

ответа так и нету

либо оптимизатор кода че-то лишнего вырезает
 
Alexandr Andreev:

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

нет rand() это обычная функция, она всегда одинаково работает

а вот если при тестировании скорости работы инициализировать константами, то тесты будут "разгоняться" при выполнении - оптимизация кода  в MQL во время выполнения не плохо работает

в общем это проверенно не однократно

Alexandr Andreev:

 и много чего зависит от обьема создаваемых переменных)))

конечно, выделение памяти это затратно по времени выполнения, я это уже проверял, тестировал динамически созданные обьекты ( указатель new ) и и просто обьекты в локальной области видимости, при тесте 100500 раз набегает время на new + delete

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

Alexandr Andreev:

А нужный нам код в таком количестве повторений у меня занимает 0 ms

ответа так и нету

либо оптимизатор кода че-то лишнего вырезает

моим скриптом тестировали? - или не дождались конца теста и прервали , или переполнили ulong  - первый параметр макроса это 10^ count 



Andrei Trukhanovich:

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

да, может и так

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

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


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