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 );}
//+------------------------------------------------------------------+voidOnStart ()
{
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?
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 |//+------------------------------------------------------------------+//+------------------------------------------------------------------+voidOnStart ()
{
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];
}
)
}
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
Ş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
Ç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
MQL5.com web sitesine giriş yapmak için çerezlerin kullanımına izin vermelisiniz.
Lütfen tarayıcınızda gerekli ayarı etkinleştirin, aksi takdirde giriş yapamazsınız.
Hesabınıza giriş yaptınız. İki faktörlü kimlik doğrulama devre dışı bırakıldı. Yeniden kurup yeni bir QR kodu tarayın veya iki faktörlü kimlik doğrulama devre dışıyken devam edin.
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
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?
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
SADECE BOMBA
işte aksini kanıtlayan kodunuz
sadece çekleri değiştirdim
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
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
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
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
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
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:
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