Алгоритмы, методы решений, сравнение их производительности - страница 20

 
Реter Konow:

Я не знаю зачем к идеальному решению добавлять сущности. Не вижу смысла.

Вы же не одеваете две шапки одновременно. А почему?

Cначала объясните это. ))


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

Проклятый мир (сборник) Авторы: Дмитрий Ганин

 
Sergey Dzyublik:

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

Проклятый мир (сборник) Авторы: Дмитрий Ганин

Искренне прошу прощения у всех, кого ненароком заставил страдать морально и психологически.

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

Наоборот, сам подвергся непонятным нападкам и немотивированной агрессии.

Видимо, эту цену платит каждый, кто не хочет идти в "ногу" с обществом.

Ну, я свой выбор сделал и ни на кого не пеняю...

 
Реter Konow:

Я не знаю зачем к идеальному решению добавлять сущности. 


Может еще рано говорить о своем коде как о идеальном решении.

А вот собственно коллекция шапок

 
Alexandr Andreev:

Может еще рано говорить о своем коде как о идеальном решении

Я говорил в общем, так сказать...

"Зачем к идельному решению (любому), прибавлять сущности."

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

1. Ошибка с количеством символов.

2. Ошибка возникающая из за коллизий самих подстрок внутри общей строки.

3. Выход за пределы памяти выделяемой для каждой конкретной строки.

4. Ошибочное убеждение, что изменение размеров массива ведет к стиранию данных.


Огромное спасибо всем за указание на эти ошибки!

 
Реter Konow:
...

Огромное спасибо всем за указание на эти ошибки!

Если быть объективным, то последний, - идеальный вариант решения, принадлежит всем, поскольку, я пришел к нему благодаря указаниям на ошибки, общению и взаимодействию с людьми.

 
Реter Konow:

Если быть объективным, то последний, - идеальный вариант решения, принадлежит всем, поскольку, я пришел к нему благодаря указаниям на ошибки, общению и взаимодействию с людьми.


Еще раз последний вариант - это просто вариант, то что было до этого было вообще не вариантом! А то что он идеальный - это спорное утверждение

 
Alexandr Andreev:

Еще раз последний вариант - это просто вариант, то что было до этого было вообще не вариантом! А то что он идеальный - это спорное утверждение

Хорошо. Пусть он будет только для меня идеальным. Каждый сам может его оценить по своей шкале.
 

Предлагаю перейти к ДЕбагу принтам и кометам - у кого какие мысли?

 

протестировал время работы если функция будет:

1. обернута в класс

2. обернута в класс, экземпляр класса создаем с помощью оператора new

3. просто вызываем функцию без использования обертки

//+------------------------------------------------------------------+

#define   SpeedTest(count_x10,msg,EX)        {uint mss=GetTickCount(); ulong count=(ulong)pow(10,count_x10);for(ulong i=0;i<count&&!_StopFlag;i++){EX;} \
                                              printf("%s: loops=%i ms=%u",msg,count,GetTickCount()-mss);}
//+------------------------------------------------------------------+
class COpen
{
private:
   string            m_symbol;
public:
                     COpen(const string symbol): m_symbol(symbol) {}
   double            getOpen(const int bar) const                 { return(iOpen(m_symbol, 0, bar)); }

};
//+------------------------------------------------------------------+
void OnStart()
{  #define loop_x10 9
//1.
   COpen sym1(_Symbol);
   srand(GetTickCount());
   SpeedTest(loop_x10, "1. COpen", sym1.getOpen(rand()));
//2.
   srand(GetTickCount());
   SpeedTest(loop_x10, "2. new COpen",
             COpen *sym2 = new COpen(_Symbol);
             sym2.getOpen(rand());
             delete sym2;
            );
//3.            
   srand(GetTickCount());
   SpeedTest(loop_x10, "3. iOpen",iOpen(NULL,0,rand()););            
}
//_______________________________________________________________________

2019.10.12 12:39:29.802 SpeedTst_class (EURUSD,M1) 1. COpen: loops=1000000000 ms=41016

2019.10.12 12:41:05.352 SpeedTst_class (EURUSD,M1) 2. new COpen: loops=1000000000 ms=95562

2019.10.12 12:41:45.939 SpeedTst_class (EURUSD,M1) 3. iOpen: loops=1000000000 ms=40578


тесты 1 и 3 рядом по производительности, т.е. оборачивать в класс вызов функции не критично, тест №2 время набежало из за вызова конструктора и деструктора

 

тест скорости выполнения при обращении к функциям SymbolInfoDouble()

#property version   "1.00"
// количество итераций теста
#define LOOPx10 8

#define   SpeedTest(count_x10,msg,EX)        {uint mss=GetTickCount(); ulong count=(ulong)pow(10,count_x10);for(ulong i=0;i<count&&!_StopFlag;i++){EX;} \
                                              printf("%s: loops=%i ms=%u",msg,count,GetTickCount()-mss);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   double lot;

   srand(GetTickCount());
   SpeedTest(LOOPx10, "calcNormVol_my()", lot = rand() / 1000.0; calcNormVol_my(lot))

   srand(GetTickCount());
   SpeedTest(LOOPx10, "calcNormVol_alexeyvik()", lot = rand() / 1000.0; calcNormVol_alexeyvik(lot))
   
   srand(GetTickCount());
   SpeedTest(LOOPx10, "calcNormVol_fxsaber()", lot = rand() / 1000.0; calcNormVol_fxsaber(lot))
   
   srand(GetTickCount());
   SpeedTest(LOOPx10, "calcNormVol_my_2()", lot = rand() / 1000.0; calcNormVol_my_2(lot))

}
//+------------------------------------------------------------------+
double calcNormVol_my(const double value)
{
   const static string sym = _Symbol;
   return(NormalizeDouble(fmax(fmin(SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP) * round(value / SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP)), SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX)),
                               SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN)),  2));
}
//+------------------------------------------------------------------+
double calcNormVol_alexeyvik(const double value)
{
//   const string sym = _Symbol;
   return(
            NormalizeDouble(fmax(fmin(SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP) * round(value / SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP)),
                                      SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX)),  SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN)), 2)
         );
}
//+------------------------------------------------------------------+
const double VolumeStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
const double VolumeMax = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
const double VolumeMin = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
const int O_DigitsInVolumeStep = 2;
double calcNormVol_fxsaber( const double value )
{
   return((value > VolumeMax) ? VolumeMax
          : ((value < VolumeMin) ? VolumeMin
             : NormalizeDouble(VolumeStep * (int)(value / VolumeStep + 0.5), O_DigitsInVolumeStep)));
}
//+------------------------------------------------------------------+
double calcNormVol_my_2( const double value )
{
   const static double volumeStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
   const static double volumeMax = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
   const static double volumeMin = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
   const static int o_digitsInVolumeStep = 2;
   return((value > volumeMax) ? volumeMax
          : ((value < volumeMin) ? volumeMin
             : NormalizeDouble(volumeStep * (int)(value / volumeStep + 0.5), o_digitsInVolumeStep)));
}
//+------------------------------------------------------------------+

2019.12.11 21:13:08.896 tst_volum (EURUSD,W1) calcNormVol_my(): loops=100000000 ms=173406

2019.12.11 21:15:45.425 tst_volum (EURUSD,W1) calcNormVol_alexeyvik(): loops=100000000 ms=156531

2019.12.11 21:15:45.533 tst_volum (EURUSD,W1) calcNormVol_fxsaber(): loops=100000000 ms=110

2019.12.11 21:15:45.916 tst_volum (EURUSD,W1) calcNormVol_my_2(): loops=100000000 ms=390