OOP'a ilginç bir bakış - sayfa 8

 
fxsaber :

Sevdiğim için böyle yazıyorum. Aynı zamanda, hata ayıklama sırasında her şey çok kötü olur.


Bu ifadede bile

kimin neyi iade ettiğini anlamak zor. Daha karmaşık olanlarda (sürekli pratik yapıyorum) - çok zor.

dönüş değeri olarak 2-3 kullanın ... peki, mantıksal işlemlerle (veya koşullu üçlü operatörle ) birleştirilmiş işlevlerin yürütülmesinin 5 sonucuna izin verin - Bunu github'da veya başka bir yerde gördüm, böyle bir kodla anlayabilirsiniz

ama bu "iyi" yaklaşık bir düzine başka ise ... IMHO, bu pratik değil

 
Maxim Kuznetsov :

Ben kesinlikle bir mql geliştiricisi değilim,

ancak C'de anahtar oldukça verimli birikili arama oluşturur ve gereksiz sayfa takaslarına veya kilitlenme önbelleklerine neden olmaz. Yani, evet, genellikle diziler ve yapılar aracılığıyla dolaylı adreslemeden daha iyidir.

bir yerde yazdılar ve burada geliştiricilerin benzer bilgileri var

sadece şunu buldum:

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

MQL5'te birlikte öğrenme ve yazma

Slava , 2011.04.14 09:59

Hayır, ne yazık ki olmayacak. Yalnızca dize türleri için eğer ... else if ... else

Anahtarda tamsayı türlerinin kullanılması nedeniyle, if ile karşılaştırıldığında birkaç kat hızlanma elde edilir.


 
Igor Makanu :

ama bu "iyi" yaklaşık bir düzine başka ise ... IMHO, bu pratik değil

Küçük canavar.

   static bool VirtualOrderSelect( const TICKET_TYPE Index, const int Select, const int Pool = MODE_TRADES )
  {
     return (VIRTUAL::SelectOrders ? VIRTUAL::SelectOrders. OrderSelect (Index, Select, Pool) :
           #ifdef VIRTUAL_SNAPSHOT_REFRESHTIME
             VIRTUAL::SnapshotPtr ?
             #ifdef __MQL5__ // Выбор по тикету в MT5 - разнообразный набор вариантов.
               (Select == SELECT_BY_TICKET) ? :: OrderSelect (Index, Select, Pool) && VIRTUAL::SnapshotPtr.CopyOrder()
                                            :
             #endif // #ifdef __MQL5__
                                              ((((Index == INT_MIN ) || (Index == INT_MAX )) && (Pool == MODE_TRADES) &&
                                               :: OrderSelect (Index, Select, Pool) &&
                                             #ifdef VIRTUAL_SNAPSHOT_WITHOUT_HISTORY
                                               VIRTUAL::SnapshotPtr.CopyOrder( true ))
                                             #else // #ifdef VIRTUAL_SNAPSHOT_WITHOUT_HISTORY
                                               VIRTUAL::SnapshotPtr.CopyOrder())
                                             #endif // #ifdef VIRTUAL_SNAPSHOT_WITHOUT_HISTORY #else
                                               || VIRTUAL::SnapshotPtr. OrderSelect (Index, Select, Pool))
                                  :
           #endif // #ifdef VIRTUAL_SNAPSHOT_REFRESHTIME
           #ifdef __MQL5__
             #ifdef __MT4ORDERS__
               :: OrderSelect (Index, Select, Pool)
             #else // __MT4ORDERS__
               false
             #endif // __MT4ORDERS__
           #else // __MQL5__
             :: OrderSelect (Index, Select, Pool)
           #endif // __MQL5__
           );
  }

mantıksal işlemler , makrolar aracılığıyla çeşitli ayarları kullanırken kısa ve öz yazmanıza olanak tanır. Ama korkunç tabii.

 
fxsaber :

mantıksal işlemler , makrolar aracılığıyla çeşitli ayarları kullanırken kısa ve öz yazmanıza olanak tanır. Ama korkunç tabii.

"Son, araçları haklı çıkarır" örneğiniz

sorum bana tamamen farklı ve anlaşılmaz bir üslupla ilgiliydi

 
fxsaber :

Küçük canavar.

Belirli bir atın dişlerine bakmazlar. Ama burada bana birkaç unutulmaz on dakikalık hata ayıklama sağlayan başka birinin koduna birkaç örnek daha verelim. Belki biri kodunuzu tanır.

      Res = (!FillingMode || (Type >= ORDER_FILLING_RETURN ) || ((FillingMode & (Type + 1 )) != Type + 1 )) ?
            (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE ) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT )) ?
             ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC ) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK )) :
            ( ENUM_ORDER_TYPE_FILLING )Type;
     return ((arrow_color == INT_MAX ) ? (MT4ORDERS::NewOrderCheck() ? 0 : - 1 ) :
           (((( int )arrow_color != INT_MIN ) || MT4ORDERS::NewOrderCheck()) &&
            MT4ORDERS:: OrderSend (MT4ORDERS::LastTradeRequest, MT4ORDERS::LastTradeResult) ?
            (MT4ORDERS::IsHedging ? ( long )MT4ORDERS::LastTradeResult.order : // PositionID == Result.order - особенность MT5-Hedge
             ((MT4ORDERS::LastTradeRequest.action == TRADE_ACTION_DEAL ) ?
              (MT4ORDERS::IsTester ? (_B2(:: PositionSelect (MT4ORDERS::LastTradeRequest.symbol)) ? PositionGetInteger ( POSITION_TICKET ) : 0 ) :
                                       // HistoryDealSelect в MT4ORDERS::OrderSend
                                      :: HistoryDealGetInteger (MT4ORDERS::LastTradeResult.deal, DEAL_POSITION_ID )) :
              ( long )MT4ORDERS::LastTradeResult.order)) : - 1 ));

Böyle yazmak kolay mıydı bilmiyorum ama hata ayıklamak ve dahası sadece okumak gerçekçi değil. Ve bu şekilde yazmak için gerçek bir sebep göremiyorum.

 
traveller00 :

Ve bu şekilde yazmak için gerçek bir sebep göremiyorum.

Elbette özneldirler. Fazladan değişkenleri ve çoklu getirileri sevmiyorum. Nedense, onlarsız EX5'in daha kısa olacağını ve daha hızlı çalışacağını düşünüyorum.

 
fxsaber :

Elbette özneldirler. Fazladan değişkenleri ve çoklu getirileri sevmiyorum. Nedense, onlarsız EX5'in daha kısa olacağını ve daha hızlı çalışacağını düşünüyorum.

Bu arada, kodun daha kısa ve daha hızlı olacağına dair bu güven, haklı olduğu gerçeği değil.

Bugün nasılsın?

 bool a=A();
bool b=B();
//....много промежуточных результатов
bool x=X();
bool Res=a||b||x ;
return Res;

ve işte burada

 return A()||B()||X();

Hız olarak aynı olacağından eminim (muhtemelen kullanılan kod ve bellek miktarı)

Sadece ikinci seçeneğin yazılması daha hızlıdır ve herkes onu yazar ve sonra bir şey eklemeniz/karmaşıklaştırmanız gerektiğinde, ikinci seçeneği bırakırlar, yalnızca zaten okunması zor olacak şekilde şişirilirler.

Bu konuda periyodik olarak yeniden düzenleme yapın - ve herhangi bir sorun olmayacaktır.

 
Aleksey Mavrin :

Bu konuda periyodik olarak yeniden düzenleme yapın - ve herhangi bir sorun olmayacaktır.

Sadece çok fazla boş zamanı olanlar veya nesnel olarak o kadar zorlananlar için, onsuz yapamayacaklar.

ZY Çok fazla getiri olduğunda, 100% kodu başka olacaktır.
 
fxsaber :

Sadece çok fazla boş zamanı olanlar ya da nesnel olarak o kadar çok baskı altındalar ki, onsuz kaçamayacakları için.

ZY Çok fazla getiri olduğunda, 100% kodu başka olacaktır.

Anlıyorum, ancak kısmen katılıyorum, herkesin, kod hata ayıklama için "mükemmel şekilde hazır" olsaydı daha hızlı bulunabilecek nispeten uzun bir hata yakalama deneyimi yaşadığını düşünüyorum.

Neyin daha fazla zaman aldığı bilinmiyor - "uygun" kodun daha uzun yazılması veya hata ayıklama ve hataların aranması, her zaman farklı düşünüyorum.

 
fxsaber :

ZY Çok fazla getiri olduğunda, 100% kodu başka olacaktır.

Hata ayıklayıcı altında C++ VS2019

kaynak:

 bool a( int v) { return (v > 0 ); }
bool b( int v) { return (v < 0 ); }
bool c( int v) { return (v == 0 );}

bool tst1( int v1, int v2, int v3)
{
         if (a(v1)) return ( true );
         if (b(v2)) return ( true );
         if (c(v3)) return ( true );
         return ( false );
}

bool tst2( int v1, int v2, int v3)
{
         return (a(v1) && b(v2) && c(v3));
}

int main()
{
         int x = 1 , y= 2 , z= 3 ;
         bool result1 = tst1(x, y, z);
         bool result2 = tst2(x, y, z);
}

asm'de hata ayıklayıcı

 bool tst1( int v1, int v2, int v3)
{
         if (a(v1)) return ( true );
000 E1918  mov         eax,dword ptr [v1]  
000 E191B  push        eax  
000 E191C  call        a ( 0 E137Ah)  
000 E1921  add         esp, 4   
000 E1924  movzx       ecx,al  
000 E1927  test        ecx,ecx  
000 E1929  je          tst1+ 3 Fh ( 0 E192Fh)  
000 E192B  mov         al, 1   
000 E192D  jmp         tst1+ 6 Fh ( 0 E195Fh)  
         if (b(v2)) return ( true );
000 E192F  mov         eax,dword ptr [v2]  
000 E1932  push        eax  
000 E1933  call        b ( 0 E13ACh)  
000 E1938  add         esp, 4   
000 E193B  movzx       ecx,al  
000 E193E  test        ecx,ecx  
000 E1940  je          tst1+ 56 h ( 0 E1946h)  
000 E1942  mov         al, 1   
000 E1944  jmp         tst1+ 6 Fh ( 0 E195Fh)  
         if (c(v3)) return ( true );
000 E1946  mov         eax,dword ptr [v3]  
000 E1949  push        eax  
000 E194A  call        c ( 0 E11B8h)  
000 E194F  add         esp, 4   
000 E1952  movzx       ecx,al  
000 E1955  test        ecx,ecx  
000 E1957  je          tst1+ 6 Dh ( 0 E195Dh)  
000 E1959  mov         al, 1   
000 E195B  jmp         tst1+ 6 Fh ( 0 E195Fh)  
         return ( false );
000 E195D  xor         al,al  
}


 bool tst2( int v1, int v2, int v3)
{
         return (a(v1) && b(v2) && c(v3));
000 E19C8  mov         eax,dword ptr [v1]  
000 E19CB  push        eax  
000 E19CC  call        a ( 0 E137Ah)  
000 E19D1  add         esp, 4   
000 E19D4  movzx       ecx,al  
000 E19D7  test        ecx,ecx  
000 E19D9  je          tst2+ 6 Dh ( 0 E1A0Dh)  
000 E19DB  mov         edx,dword ptr [v2]  
000 E19DE  push        edx  
000 E19DF  call        b ( 0 E13ACh)  
000 E19E4  add         esp, 4   
000 E19E7  movzx       eax,al  
000 E19EA  test        eax,eax  
000 E19EC  je          tst2+ 6 Dh ( 0 E1A0Dh)  
000 E19EE  mov         ecx,dword ptr [v3]  
000 E19F1  push        ecx  
000 E19F2  call        c ( 0 E11B8h)  
000 E19F7  add         esp, 4   
000 E19FA  movzx       edx,al  
000 E19FD  test        edx,edx  
000 E19FF  je          tst2+ 6 Dh ( 0 E1A0Dh)  
000 E1A01  mov         dword ptr [ebp- 0 C4h], 1   
000 E1A0B  jmp         tst2+ 77 h ( 0 E1A17h)  
000 E1A0D  mov         dword ptr [ebp- 0 C4h], 0   
000 E1A17  mov         al, byte ptr [ebp- 0 C4h]  
}



Saymamak için bir çağrıyı sadece 2 sütunda komutlara indirdim:

ts1:                                                    tst2:
000 E1918  mov         eax,dword ptr [v1]                 000 E19C8  mov         eax,dword ptr [v1]
000 E191B  push        eax                               000 E19CB  push        eax  
000 E191C  call        a ( 0 E137Ah)                       000 E19CC  call        a ( 0 E137Ah)  
000 E1921  add         esp, 4                              000 E19D1  add         esp, 4   
000 E1924  movzx       ecx,al                             000 E19D4  movzx       ecx,al  
000 E1927  test        ecx,ecx                           000 E19D7  test        ecx,ecx  
000 E1929  je          tst1+ 3 Fh ( 0 E192Fh)                 000 E19D9  je          tst2+ 6 Dh ( 0 E1A0Dh)  
000 E192B  mov         al, 1                                000 E19DB  mov         edx,dword ptr [v2]  
000 E192D  jmp         tst1+ 6 Fh ( 0 E195Fh)                 000 E19DE  push        edx 


gördüğünüz gibi, burada komutlar neredeyse birbirini tekrar ediyor, ilk testte birkaç dönüş daha eklemeniz gerektiği açık.

% 99 kesinlikle, işlemci düzeyinde bu kodların saat döngüsüne kadar aynı hızda yürütüleceğini düşünüyorum - işlemci hala optimizasyon, paralelleştirme ve mikro komut düzeyinde başka ne işe yarıyor?