Algoritmos, métodos de solución, comparación de su rendimiento - página 20

 
Реter Konow:

No sé por qué añadir entidades a una solución ideal. No veo el punto.

No puedes llevar dos sombreros al mismo tiempo. ¿Y por qué?

Explica esto primero. ))


"Estás torturando a la gente y haciéndola sufrir, rebajándola moral y psicológicamente...."

Mundo maldito (recopilación)Autores: Dmitri Ganin

 
Sergey Dzyublik:

"Si torturas a las personas y las haces sufrir, las rebajas moral y psicológicamente...."

El mundo maldito (colección)Autores: Dmitry Ganin

Pido sinceras disculpas a todas las personas a las que, sin querer, he hecho sufrir moral y psicológicamente.

No he perseguido ningún otro propósito que no sea el de encontrar la solución perfecta a un problema concreto.

Por el contrario, yo mismo sufrí ataques incomprensibles y agresiones inmotivadas.

Aparentemente, este es el precio que paga quien no quiere "estar al día" con la sociedad.

Bueno, he tomado mi decisión y no estoy culpando a nadie...

 
Реter Konow:

No sé por qué añadir entidades a una solución ideal.


Quizá sea demasiado pronto para hablar de su código como una solución ideal.

Y aquí está la colección actual de sombreros

 
Alexandr Andreev:

Tal vez sea demasiado pronto para hablar de su código como una solución perfecta

Estaba hablando en términos generales, por así decirlo...

"Por qué, a una solución ideal (cualquier solución), añadirle entidades".

Debo decir que muchas personas me dieron ideas muy valiosas y me señalaron los errores correctos:

1. un error en el recuento de caracteres.

2. error causado por colisiones de subcadenas dentro de una cadena común.

3. Desbordamiento de la memoria asignada a cada cadena particular. 4.

4. La falsa creencia de que cambiar el tamaño de una matriz conlleva el borrado de datos.


Muchas gracias a todos por señalar estos errores.

 
Реter Konow:
...

¡Muchas gracias a todos por señalar esos errores!

Para ser objetivos, la última, la solución ideal, es de todos, ya que, llegué a ella gracias a señalar los errores, comunicar e interactuar con la gente.

 
Реter Konow:

Para ser objetivos, la última, la solución ideal, es de todos, porque, llegué a ella a través de señalar los errores, comunicar e interactuar con la gente.


Una vez más, la última opción es sólo una opción, ¡lo que venía antes no era una opción en absoluto! Y el hecho de que sea perfecto es un punto discutible

 
Alexandr Andreev:

Una vez más, la última opción es sólo una opción, ¡lo que venía antes no era una opción en absoluto! Y el hecho de que sea perfecto es un punto discutible.

Bien, de acuerdo. Que sea perfecto sólo para mí. Cada uno puede juzgarlo según su propia escala.
 

Sugiero que pasemos a las huellas de DEBAG y a los cometas, ¿quién tiene alguna idea?

 

comprobado el tiempo de ejecución si la función es:

1. envuelto en una clase

2. envuelto en una clase, se crea una instancia de la clase utilizando el operador new

3. simplemente llamar a la función sin usar un wrapper

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

#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:39:29.802 SpeedTst_class (EURUSD,M1) 1. COpen: loops=1000000000 ms=41016

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

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


Las pruebas 1 y 3 son paralelas en términos de rendimiento, es decir, la envoltura de la llamada a la función en la clase no es crítica, la prueba 2 ha añadido tiempo debido a las llamadas al constructor y al destructor

 

Prueba de velocidad de ejecución deSymbolInfoDouble()

#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