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

 
Это правильно, что нет ошибки?
void OnStart()
{
  for (int i = 0; i < 5; i++) // OK
}
 
fxsaber:

Так всегда было, что нельзя делать указатели на штатные функции?

Да, всегда нельзя было

fxsaber:
Это правильно, что нет ошибки?

Это недоработка хотя бы потому, что следующие записи эквивалентны

void f1() { for  (; false ;) } //нормально ???
void f2() { while(  false  ) } //Error: '}' - semicolon expected

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

 

нужно из 2-х ushort получить 1 uint

есть 2 варианта(желтый / зеленый):

input ushort inA = USHORT_MAX;
input ushort inB = USHORT_MAX;
input ushort inC = USHORT_MAX;
input ushort inD = USHORT_MAX;
uint param1 = (uint)inA << (sizeof(ushort) * 8) | inB;
uint param2 = (uint)inC << (sizeof(ushort) * 8) | inD;
union ushortTouint
{
   uint param[2];
   ushort in[4];
};
ushortTouint param_arr;
//+------------------------------------------------------------------+
void OnStart()
{
   printf("ver 1:  %X , %X", param1, param2);
   param_arr.in[0] = inA;
   param_arr.in[1] = inB;
   param_arr.in[2] = inC;
   param_arr.in[3] = inD;
   printf("ver 2:  %X , %X", param_arr.param[0], param_arr.param[1]);
}
//+------------------------------------------------------------------+

как бы узнать какой вариант преобразований будет быстрее работать при оптимизации (буду использовать 10 uint и соответственно 20 ushort)

 
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

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

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