uzmanlar için soru #define - sayfa 5

 
Alexandr Andreev :

Bize testimizin tam kodunu verin

tutun, ancak bir seçenek olarak, onu bir inc ++ değişkeni ile değiştirmek için tekrar tartışmak için Rand () kullanmanın amacını görmüyorum

 #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;} \
                                               printf ( "%s: loops = %llu seconds=%.4f" ,msg,count,( double )( GetTickCount ()-mss) / 1000000.0 );}



//+------------------------------------------------------------------+
void OnStart ()
{
   int arr1[], arr2[], arr3[];
   int cnt1 = ArrayResize (arr1, 100 );
   int cnt2 = ArrayResize (arr2, 200 );
   int cnt3 = ArrayResize (arr3, 300 );
   ulong sum = 0 ;

   SpeedTest( 3 , "ArraySize" ,
       for ( int i = 0 ; i < ArraySize (arr1); i++)
      {
         for ( int j = 0 ; j < ArraySize (arr2); j++)
         {
             for ( int k = 0 ; k < ArraySize (arr3); k++)
            {
               arr3[k] = rand ();
               sum += arr3[k];
            }
            arr2[j] = rand ();
            sum += arr2[j];
         }
         arr1[i] = rand ();
         sum += arr1[i];
      }
   )
   
   SpeedTest( 3 , "cnt" ,
       for ( int i = 0 ; i < cnt1; i++)
      {
         for ( int j = 0 ; j < cnt2; j++)
         {
             for ( int k = 0 ; k < cnt3; k++)
            {
               arr3[k] = rand ();
               sum += arr3[k];
            }
            arr2[j] = rand ();
            sum += arr2[j];
         }
         arr1[i] = rand ();
         sum += arr1[i];
      }
   )

}


evet... Kodumda bir tür hata var , zamanı saniye cinsinden göstermek istiyorum ama 10 kat daha fazla alıyorum, 1.000.000'a doğru bir şekilde böldüm, bunun nedenini kim söyleyebilir?

 
Igor Makanu :

tutun, ancak bir seçenek olarak, onu bir inc ++ değişkeni ile değiştirmek için tekrar tartışmak için Rand () kullanmanın amacını görmüyorum


evet... Kodumda bir tür hata var , zamanı saniye cinsinden göstermek istiyorum ama 10 kat daha fazla alıyorum, 1.000.000'a doğru bir şekilde böldüm, bunun nedenini kim söyleyebilir?

SADECE BOMBA

işte aksini kanıtlayan kodunuz

 //+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#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;} \
                                               printf ( "%s: loops = %llu seconds=%.4f" ,msg,count,( double )( GetTickCount ()-mss)/ 1000000.0 );}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void OnStart ()
{
   int arr1[], arr2[], arr3[];
   int cnt1 = ArrayResize (arr1, 100 );
   int cnt2 = ArrayResize (arr2, 200 );
   int cnt3 = ArrayResize (arr3, 300 );
   ulong sum = 0 ;

   
   SpeedTest( 3 , "cnt" ,
       for ( int i = 0 ; i < cnt1; i++)
      {
         for ( int j = 0 ; j < cnt2; j++)
         {
             for ( int k = 0 ; k < cnt3; k++)
            {
               arr3[k] = rand ();
               sum += arr3[k];
            }
            arr2[j] = rand ();
            sum += arr2[j];
         }
         arr1[i] = rand ();
         sum += arr1[i];
      }
   )

   SpeedTest( 3 , "ArraySize" ,
       for ( int i = 0 ; i < ArraySize (arr1); i++)
      {
         for ( int j = 0 ; j < ArraySize (arr2); j++)
         {
             for ( int k = 0 ; k < ArraySize (arr3); k++)
            {
               arr3[k] = rand ();
               sum += arr3[k];
            }
            arr2[j] = rand ();
            sum += arr2[j];
         }
         arr1[i] = rand ();
         sum += arr1[i];
      }
   )
}
 
Alexandr Andreev :

SADECE BOMBA

işte aksini kanıtlayan kodunuz

sadece çekleri değiştirdim

 
Alexandr Andreev :

sadece çekleri değiştirdim

2020.11.02 21:01:38.590 22222 (USDCHF,H1) cnt: döngüler = 1000 saniye=821.7159

2020.11.02 21:01:52.353 22222 (USDCHF,H1) ArraySize: döngüler = 1000 saniye=807.9415


Buna dayanarak, ArraySize değişkeni kullanmaktan daha hızlı olduğu ortaya çıktı =)))) testte bir sorun var
 
Roman :

Evet, ne testi? ))
Döngü koşulunun her iki çeşidini de kendiniz gösterdiniz.
Igor da yukarıdaki kodu getirdi.
Döngünün yürütülmesini size değişkeni ve döngü koşulunda ArraySize() ile ölçün.

bana aksini kanıtla

ve sonra benim testimde bir nedenden dolayı aynılar

 
Alexandr Andreev :

sadece çekleri değiştirdim

evet yapılması gerekiyor

bu sefer tembel

testleri bir dış döngüye sardı, şöyle anladım:

2020.11.02 22:06:43.557 HızTst (EURUSD,H1) ArraySize: döngüler = 1000 saniye=117.4626

2020.11.02 22:06:58.328 HızTst (EURUSD,H1) cnt: döngüler = 1000 saniye=102.7337

2020.11.02 22:07:13.075 HızTst (EURUSD,H1) ArraySize: döngüler = 1000 saniye=87.9782

2020.11.02 22:07:27.850 HızTst (EURUSD,H1) cnt: döngüler = 1000 saniye=73.2461

2020.11.02 22:07:42.598 HızTst (EURUSD,H1) ArraySize: döngüler = 1000 saniye=58.4859

2020.11.02 22:07:57.380 HızTst (EURUSD,H1) cnt: döngüler = 1000 saniye=43.7522

2020.11.02 22:08:12.891 HızTst (EURUSD,H1) ArraySize: döngüler = 1000 saniye=28.9861

2020.11.02 22:08:28.874 HızTst (EURUSD,H1) cnt: döngüler = 1000 saniye=13.4910

 
Igor Makanu :

evet yapılması gerekiyor

bu sefer tembel

testleri bir dış döngüye sardı, şöyle anladım:

2020.11.02 22:06:43.557 HızTst (EURUSD,H1) ArraySize: döngüler = 1000 saniye=117.4626

2020.11.02 22:06:58.328 HızTst (EURUSD,H1) cnt: döngüler = 1000 saniye=102.7337

2020.11.02 22:07:13.075 HızTst (EURUSD,H1) ArraySize: döngüler = 1000 saniye=87.9782

2020.11.02 22:07:27.850 HızTst (EURUSD,H1) cnt: döngüler = 1000 saniye=73.2461

2020.11.02 22:07:42.598 HızTst (EURUSD,H1) ArraySize: döngüler = 1000 saniye=58.4859

2020.11.02 22:07:57.380 HızTst (EURUSD,H1) cnt: döngüler = 1000 saniye=43.7522

2020.11.02 22:08:12.891 HızTst (EURUSD,H1) ArraySize: döngüler = 1000 saniye=28.9861

2020.11.02 22:08:28.874 HızTst (EURUSD,H1) cnt: döngüler = 1000 saniye=13.4910

Ve şimdi döngüde onları değiştirin - şaşırın

 
Alexandr Andreev :

Ve şimdi döngüde onları değiştirin - şaşırın

Şaşırmayacağım, derleyicinin kodu anında optimize edebileceğini biliyorum.

ancak, IMHO, iç içe döngülerde, yine de gereksiz yere ArraySize() öğesini çağırmamalısınız , bu daha kolay ve ben zaten ters döngüyü kullanmaya alışkınım

 for ( int i = ArraySize (arr)- 1 ; i >= 0 ; i--)

Tabii ki, bu bazen uygunsuz olur, o zaman geçici bir değişken arasında bir döngü yaparım - seçenek numaranız 2

IMHO, güvenilir ve ne olacağını anlıyorsun

 

IMHO'ya karşı bir şey söyleyemem.

Çok büyük tekrarlarda, zafer birinci ve ikinci yöntemlerde rastgele oldu ... büyük olasılıkla mevcut anda işlemcinin önbelleğine ve toplam yüke bağlı hale geldi.

Soru döngüyle ilgili değildi - ancak işlevin açılmasıyla ilgiliydi. Tıpkı bir örnek olarak ArraySizehere

Sonuç;

for (int i=0; i<ArraySIze(mas); i++) == for (int i=0; i<size; i++)


Ancak ikinci kısma boyut değişkeni ile başlatma eklersek. daha sonra ilk yöntem, bu değişkeni başlatma ve bir değere eşitleme süresi için liderliği alır., yalnızca büyük tekrarlarla fark edilebilir.

 

döngünün gövdesindeki dizilerin boyutunu değiştirirseniz, anında optimizasyon artık çalışmaz

bu yüzden kodu değiştirin:

 for ( int loop= 0 ; loop < 5 ;loop++)
   {
   int cnt1 = ArrayResize (arr1, 100 +loop);
   int cnt2 = ArrayResize (arr2, 200 +loop);
   int cnt3 = ArrayResize (arr3, 300 +loop);
   
   SpeedTest( 3 , "cnt" ,
.....

Alexandr Andreev :

daha sonra ilk yöntem, bu değişkeni başlatma ve bir değere eşitleme süresi için liderliği alır., yalnızca büyük tekrarlarla fark edilebilir.

aşmaz

çalışma zamanı optimizasyonu lider olacak

bu kadar basit makine komutlarını profil oluşturucu olmadan test edemezsiniz, genel olarak bir döngüde istediğinizi yazabilirsiniz, isteğe bağlı olarak, test cihazında test edin, hız bunun için önemlidir