Hatalar, hatalar, sorular - sayfa 2880

 
Igor Makanu :

Numara

yinelenen kod bölümleri varsa - optimizasyon testi yapın!

rand()'ın ne kadar süre çalıştığı ne fark eder?

evet, test süresinin 2/3'ünü çalıştırmasına izin verin, asıl mesele rand()'ın çalışma süresinin sabit olmasıdır

IMHO, sistem işlevlerini yürütmek için bağlamı değiştirmeniz gerekiyor, ancak MQL kodunuz sistem MQL işlevlerini kullanacak mı? - test edilecek ideal kodun anlamı?

)) hızdaki fark, yöntemlerden biri (1 ila 4) lehine 4 kat olabilir, ancak rand işlemi, kodun geri kalanından 10 kat daha uzundur, bu fark görünmez (11 ila 14)

 
Alexandr Andreev :

)) hızdaki fark, yöntemlerden biri (1 ila 4) lehine 4 kat olabilir, ancak rand işlemi, kodun geri kalanından 10 kat daha uzundur, bu fark görünmez (11 ila 14)

hayır yapamadım

fark hemen görünür

geliştiricilerin yeniliklerde duyurduğu bir şeyi kontrol edelim, genellikle bazı işlevler için zaman serilerine erişim süresinin optimize edildiğini yazıyorlar = uzun süredir kontrol edilmedi

 #define   SpeedTest(count_x10,msg,EX)        { ulong mss= GetMicrosecondCount (); ulong count=( ulong ) pow ( 10 ,count_x10); for ( ulong _i= 0 ;_i<count&&! _StopFlag ;_i++){EX;} \
//+------------------------------------------------------------------+
void OnStart ()
{
   double sum1 = 0.0 ;
   SpeedTest( 7 , "tst 1 : " ,
   {
      sum1 += iOpen ( NULL , 0 , rand ());
   });
//--
   double sum2 = 0.0 ;
   SpeedTest( 7 , "tst 2 : " ,
   {
       double o[];
       CopyOpen ( NULL , 0 , rand (), 1 , o);
      sum2 += o[ 0 ];
   });
   Print (sum1, " : " , sum2);
}
//+------------------------------------------------------------------+

2020.10.16 02:11:20.671 HızTst (EURUSD,H1) tst 1: : döngüler=10000000 ms=353174

2020.10.16 02:11:21.967 HızTst (EURUSD,H1) tst2 : : döngüler=10000000 ms=1296043

2020.10.16 02:11:21.967 HızTst (EURUSD,H1) 11304533.15558525 : 11303930.69247558

2020.10.16 02:11:44.012 HızTst (EURUSD,H1) tst1 : : döngüler=10000000 ms=359757

2020.10.16 02:11:45.369 HızTst (EURUSD,H1) tst2 : : döngüler=10000000 ms=1357325

2020.10.16 02:11:45.369 HızTst (EURUSD,H1) 11304350.05612442 : 11304321.21848488

 
Igor Makanu :

genellikle kritik olmayan

rand() çalışma zamanı sabittir, büyük olasılıkla normal bir C++ işlevidir, google "Rand c++ kaynak kodu"

başlatmak gerekir, ancak sabitlerle başlatırsanız, optimizasyonla karşılaşabilirsiniz.

genel olarak, rand () 'dan hoşlanmama net değil

böyle bir şeyle başlatma seçeneği olarak:

hızlı olacak


betiğinizi başlattı, IMHO doğru değil

ana zaman, kodu önbelleğe ve ardından işlemciye yüklemektir.

peki, sistem zamanlayıcısının ayrıklığını ekleyin

neredeyse rastgele bir sayı alıyoruz

uzun bir süre, yaklaşık 100500 kez test etmeniz gerekiyor, IMHO

Rand() sonucu gürültülü yapar.
Bilgisayarımda, döngünün bir yinelemesi yaklaşık bir buçuk nanosaniye sürer.

İki Rand() ile bir yineleme iki katına çıkar - neredeyse 3 nanosaniyeye kadar. Aynı zamanda, böyle bir yinelemede, büyük bir dizinin bir öğesine erişimin iki kez ortadan kalktığını anlamanız gerekir, bu da oldukça pahalıdır.
Böylece toplam yineleme süresinin yaklaşık 2/3'ünün iki Rand() için harcandığını varsayabiliriz. Tabii ki, "büyüklük sırası" konusunda heyecanlandım)

Önceden hazırlanmış dizi rastgele sayılarla doluysa nasıl optimizasyonla karşılaşabileceğinizi anlamadım.

Her nasılsa, zaten rand () performansıyla ilgiliydi. Hatta kendime benzer bir fonksiyon yazmaya çalıştım. https://www.mql5.com/ru/forum/170952/page137#comment_12010041

 #define Num 10000000
#define SpeedTest(msg,s,EX)  { ulong mss= GetMicrosecondCount (); EX \
                                    mss= GetMicrosecondCount ()-mss;\
                                     printf ( "%-30s%llu µs; Сумма - %llu" ,msg,mss,s);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{
   ulong sum = 0 ;
   ushort in[];
   ArrayResize (in,Num* 2 );
   for ( int i= 0 ; i<Num* 2 ; i++) in[i] = ( ushort ) rand ();
   SpeedTest( "test binary shift : " , sum,
   for ( int i = 0 ; i<( 2 *Num- 1 );i+= 2 )
   {
      sum+=in[i]<<( sizeof ( ushort )* 8 ) | in[i+ 1 ];
   });
//+------------------------------------------------------------------+ 
   sum = 0 ;
   union ushortTouint
   {
       uint param;
       ushort in[ 2 ];
   } u;
   SpeedTest( "test union : " , sum,
   for ( int i = 0 ; i<( 2 *Num- 1 );i+= 2 )
   {
      u.in[ 0 ]=in[i+ 1 ];
      u.in[ 1 ]=in[i];
      sum+=u.param;
   });
//+------------------------------------------------------------------+   
   sum= 0 ;
   SpeedTest( "test binary shift + rand() : " , sum,
   for ( int i = 0 ; i<( 2 *Num- 1 );i+= 2 )
   {
      sum+=( ushort ) rand ()<<( sizeof ( ushort )* 8 ) | ( ushort ) rand ();
   });
//+------------------------------------------------------------------+  
   sum = 0 ;
   SpeedTest( "test union + rand() : " , sum,
   for ( int i = 0 ; i<( 2 *Num- 1 );i+= 2 )
   {
      u.in[ 0 ]=( ushort ) rand ();
      u.in[ 1 ]=( ushort ) rand ();
      sum+=u.param;
   });
}

sonuç

 2020.10 . 15 18 : 30 : 34.752 TestMakanu (USDCAD,M1)  test binary shift :           13474 µs; Сумма - 10736778112806491
2020.10 . 15 18 : 30 : 34.763 TestMakanu (USDCAD,M1)  test union :                   10189 µs; Сумма - 10736778112806491
2020.10 . 15 18 : 30 : 34.792 TestMakanu (USDCAD,M1)  test binary shift + rand () :   29103 µs; Сумма - 10741215942967312
2020.10 . 15 18 : 30 : 34.820 TestMakanu (USDCAD,M1)  test union + rand () :         28125 µs; Сумма - 10737655794873175
2020.10 . 15 18 : 30 : 37.802 TestMakanu (USDCAD,M1)  test binary shift :           11144 µs; Сумма - 10739125609966082
2020.10 . 15 18 : 30 : 37.812 TestMakanu (USDCAD,M1)  test union :                   10334 µs; Сумма - 10739125609966082
2020.10 . 15 18 : 30 : 37.840 TestMakanu (USDCAD,M1)  test binary shift + rand () :   27495 µs; Сумма - 10739749025492645
2020.10 . 15 18 : 30 : 37.867 TestMakanu (USDCAD,M1)  test union + rand () :         26782 µs; Сумма - 10738717766184542
2020.10 . 15 18 : 30 : 40.356 TestMakanu (USDCAD,M1)  test binary shift :           10618 µs; Сумма - 10738510882058397
2020.10 . 15 18 : 30 : 40.367 TestMakanu (USDCAD,M1)  test union :                   11354 µs; Сумма - 10738510882058397
2020.10 . 15 18 : 30 : 40.395 TestMakanu (USDCAD,M1)  test binary shift + rand () :   27637 µs; Сумма - 10738670876702722
2020.10 . 15 18 : 30 : 40.422 TestMakanu (USDCAD,M1)  test union + rand () :         26772 µs; Сумма - 10737441784096963
 

Bence sonuç, ne kullanılacağının neredeyse hiç fark yaratmamasıdır - sendika veya ikili kayma yoluyla.
Renkle çalışmak için iCanvas kitaplığımda bu yöntemlerin her ikisini de kullanıyorum.

 union argb {
   uint clr;
   uchar c[ 4 ];
};


Performansı da uzun süre test ettiğimi hatırladım ve neredeyse hiçbir fark olmadığı sonucuna vardım. Ancak sendikalı kod daha okunabilir.
Açıkçası bu beni hayal kırıklığına uğrattı çünkü. sendika ile performansta gözle görülür bir kazanç elde edeceğimi umuyordum.

 
Nikolai Semko :

Önceden hazırlanmış dizi rastgele sayılarla doluysa nasıl optimizasyonla karşılaşabileceğinizi anlamadım.

yukarıdaki 2 link habr verdi, ilk makalede derlemeden sonra normal bir döngünün nasıl göründüğü iyi gösterildi

Yürütme optimizasyonuna kesinlikle ulaşabileceğinizi söylemiyorum, ancak IMHO, dizi değişmezse, ki bu aslında döngü için sabit bir boyuta sahip sabit bir bellek alanıdır, hiçbir optimizasyonun olmayacağı bir gerçek değildir. yukarı, bir tür işlemci üzerinde ve hem derleyiciden hem de önbelleğe sahip işlemciden optimizasyon beklenebilir


Nikolay Semko :

Bence sonuç, ne kullanılacağının neredeyse hiç fark yaratmamasıdır - sendika veya ikili kayma yoluyla.

evet, vardiyayı kullanacağım, kod okunabilir ve yeni bir veri türü tanıtmaya gerek yok - birleşim
 
Igor Makanu :

yukarıdaki 2 link habr verdi, ilk makalede derlemeden sonra normal bir döngünün nasıl göründüğü iyi gösterildi

Yürütme optimizasyonuna kesinlikle ulaşabileceğinizi söylemiyorum, ancak IMHO, dizi değişmezse, ki bu aslında döngü için sabit bir boyuta sahip sabit bir bellek alanıdır, hiçbir optimizasyonun olmayacağı bir gerçek değildir. yukarı

sonuçlara bakılırsa, optimizasyon kokusu yok

 
Nikolai Semko :

sonuçlara bakılırsa, optimizasyon kokusu yok

Evet

anlaşmazlık belirli bir kodda değil

ve test metodolojisinin kendisinde, en iyi şekilde test ettiğim gerçeğine hala bağlıyım ve Rand() bozulmalar getirse de, orantılı değil, doğrusal bir katsayı, yani. Hızda %5'ten daha az fark yoksa doğruluk esasen çok önemli değildir, IMHO

 
Sevgili, en azından birileri en azından benim için anlaşılmaz bir duruma cevap verebilir mi?
 

Merhaba!

Muhtemelen bir MQL5 geliştiricisi için bir sorum var? belki başka biri biliyordur... ME derleyici/kod düzenleyicisini IDEA veya Visual Studio gibi bazı popüler geliştirme ortamlarıyla entegre etmeyi planlıyor musunuz? Benim için Meta Editör büyük bir acı. Blokların katlanması yok, şablonların otomatik olarak değiştirilmesi yok (için yazmaya başladığınız gibi(... ve size hemen ikame etmek için bir döngü şablonu ve çok daha fazlasını sunuyor), normalin önemli parçalarının vurgulanması yok. Ve Modern robotların karmaşık olduğu, büyük projeler olduğu ve kod yönetimi ve ortak geliştirme olasılığı için çok daha büyük gereksinimler olduğu gerçeğinden bahsetmiyorum.

Artık kimse editörlerini ve derleyicilerini yazmıyor, herkes onları reddediyor ve Microsoft, JetBrains, vb.'nin hazır çözümlerine geçiyor. Tüm modern editörler, istediğiniz her şeyi içine sokmanıza izin veren özel eklenti sistemlerine sahiptir. Görev prensipte zor değil.

 
Сергей Таболин :
Sevgili, en azından birileri en azından benim için anlaşılmaz bir duruma cevap verebilir mi?

Ve programcıların daha da gerisindesiniz. O zaman kesinlikle yardım edecekler.