알고리즘, 결정 방법, 성능 비교 - 페이지 20

 
Реter Konow :

이상적인 솔루션에 엔터티를 추가해야 하는 이유를 모르겠습니다. 나는 요점이 보이지 않는다.

동시에 두 개의 모자를 쓰지 않습니다. 그리고 왜?

이것을 먼저 설명하십시오. ))


"당신은 사람들을 고문하고 고통스럽게 만들고 도덕적으로, 심리적으로 낮추십시오.... "

저주받은 세계(컬렉션) 저자: Dmitry Ganin

 
Sergey Dzyublik :

"당신은 사람들을 고문하고 고통스럽게 만들고 도덕적으로, 심리적으로 낮추십시오.... "

저주받은 세계(컬렉션) 저자: Dmitry Ganin

본의 아니게 도덕적, 정신적 고통을 겪을 모든 분들께 진심으로 사과드립니다.

특정 문제에 대한 이상적인 해결책을 찾는 것 외에는 어떤 목표도 추구하지 않았습니다.

오히려 그 자신도 이해할 수 없는 공격과 의욕 없는 공격을 당했다.

분명히이 대가는 사회를 따라 가고 싶지 않은 모든 사람이 지불합니다.

글쎄, 나는 내 선택을했고 나는 누구를 비난하지 않습니다 ...

 
Реter Konow :

이상적인 솔루션에 엔터티를 추가해야 하는 이유를 모르겠습니다.


귀하의 코드를 이상적인 솔루션이라고 말하기에는 너무 이릅니다.

그리고 이것은 실제 모자 컬렉션입니다.

 
Alexandr Andreev :

귀하의 코드를 이상적인 솔루션으로 이야기하기에는 너무 이릅니다.

일반적으로 얘기했는데...

"이상적인 솔루션(모든)에 엔터티를 추가해야 하는 이유"

나는 많은 사람들이 나에게 매우 귀중한 아이디어를 주고 올바른 실수를 지적했다고 말해야 합니다.

1. 문자 수 오류.

2. 공통 문자열 내에서 부분 문자열 자체의 충돌로 인해 발생하는 오류.

3. 각 특정 라인에 할당된 메모리가 부족합니다.

4. 배열의 크기를 변경하면 데이터가 지워진다는 잘못된 믿음.


이러한 오류를 지적해 주신 모든 분들께 감사드립니다!

 
Реter Konow :
...

이러한 오류를 지적해 주신 모든 분들께 감사드립니다!

객관적으로 말해서 가장 이상적인 솔루션 은 모두 의 몫입니다. 오류를 지적하고 사람들과 소통하고 교류하면서 오게 되었기 때문입니다.

 
Реter Konow :

객관적으로 말해서 가장 이상적인 솔루션 은 모두 의 몫입니다. 오류를 지적하고 사람들과 소통하고 교류하면서 오게 되었기 때문입니다.


다시 한 번, 마지막 옵션은 옵션일 뿐이며 이전에는 옵션이 전혀 아니었습니다! 그리고 그가 완벽하다는 사실은 논란의 여지가 있는 진술입니다.

 
Alexandr Andreev :

다시 한 번, 마지막 옵션은 옵션일 뿐이며 이전에는 옵션이 전혀 아니었습니다! 그리고 그가 완벽하다는 사실은 논란의 여지가 있는 진술입니다.

좋은. 나를 위해 완벽하게 하자. 누구나 자신의 척도로 평가할 수 있습니다.
 

나는 DEbug 지문과 혜성으로 넘어갈 것을 제안합니다. 누가 생각이 있습니까?

 

함수가 다음과 같은 경우 실행 시간을 테스트했습니다.

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: 루프=1000000000ms=41016

2019.10.12 12:41:05.352 SpeedTst_class(EURUSD,M1) 2. 새로운 COpen: 루프=1000000000 ms=95562

2019.10.12 12:41:45.939 SpeedTst_class(EURUSD,M1) 3. iOpen: 루프=1000000000ms=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(): 루프=100000000ms=173406

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

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

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