Algoritmi, metodi di soluzione, confronto delle loro prestazioni - pagina 20

 
Реter Konow:

Non so perché si dovrebbero aggiungere entità a una soluzione ideale. Non vedo il punto.

Non si indossano due cappelli allo stesso tempo. E perché?

Spiega prima questo. ))


"State torturando le persone e le fate soffrire, abbassandole moralmente e psicologicamente...."

Mondo maledetto (Raccolta)Autori: Dmitri Ganin

 
Sergey Dzyublik:

"Si tortura la gente e la si fa soffrire, la si abbassa moralmente e psicologicamente...."

Il mondo maledetto (raccolta)Autori: Dmitry Ganin

Mi scuso sinceramente con tutti quelli che ho inavvertitamente fatto soffrire moralmente e psicologicamente.

Non ho perseguito alcuno scopo se non quello di trovare la soluzione perfetta ad un problema particolare.

Al contrario, io stesso ho subito attacchi incomprensibili e aggressioni immotivate.

A quanto pare, questo è il prezzo pagato da chiunque non voglia "stare al passo" con la società.

Bene, ho fatto la mia scelta e non sto incolpando nessuno...

 
Реter Konow:

Non so perché si dovrebbero aggiungere entità a una soluzione ideale.


Forse è troppo presto per parlare del tuo codice come di una soluzione ideale.

Ed ecco l'attuale collezione di cappelli

 
Alexandr Andreev:

Forse è troppo presto per parlare del tuo codice come di una soluzione perfetta

Parlavo in termini generali, per così dire...

"Perché, a una soluzione ideale (qualsiasi soluzione), aggiungere entità".

Devo dire che molte persone mi hanno dato idee molto preziose e mi hanno indicato gli errori giusti:

1. un errore nel conteggio dei caratteri.

2. errore causato da collisioni di sottostringhe all'interno di una stringa comune.

3. Eccesso di memoria allocata per ogni particolare stringa. 4.

(4) Falsa convinzione che cambiare la dimensione di un array porti alla cancellazione dei dati.


Grazie mille a tutti voi per aver segnalato questi errori!

 
Реter Konow:
...

Grazie mille a tutti voi per aver sottolineato questi errori!

Per essere oggettivi, l'ultima, la soluzione ideale, appartiene a tutti, in quanto, ci sono arrivato grazie alla segnalazione di errori, comunicando e interagendo con le persone.

 
Реter Konow:

Per essere oggettivi, l'ultima, la soluzione ideale, appartiene a tutti, perché, ci sono arrivato attraverso la segnalazione di errori, comunicando e interagendo con le persone.


Ancora una volta, l'ultima opzione è solo un'opzione, quella che veniva prima non era affatto un'opzione! E il fatto che sia perfetto è un punto irrilevante

 
Alexandr Andreev:

Ancora una volta, l'ultima opzione è solo un'opzione, quella che veniva prima non era affatto un'opzione! E il fatto che sia perfetto è un punto irrilevante.

Ok, va bene. Che sia perfetto solo per me. Ognuno può giudicarlo sulla propria scala.
 

Propongo di passare alle stampe DEBAG e alle comete - chi ha qualche idea?

 

testato il tempo di esecuzione se la funzione è:

1. avvolto in una classe

2. avvolto in una classe, un'istanza della classe viene creata usando l 'operatore new

3. chiamare semplicemente la funzione senza usare 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: loop=1000000000 ms=41016

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

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


I test 1 e 3 sono fianco a fianco in termini di prestazioni, cioè il wrapping delle chiamate di funzione nella classe non è critico, il test 2 ha aggiunto tempo a causa delle chiamate al costruttore e al distruttore

 

Test di velocità di esecuzione diSymbolInfoDouble()

#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