Hatalar, hatalar, sorular - sayfa 2315

 
fxsaber :

by_ref neden by_val'den daha yavaş?

Nereden geliyor?

kod aynı ise

 //Test.mqh
         int by_ref( string & var ) { return int ( var ) % 100 ; }
         int by_val( string    var ) { return int ( var ) % 100 ; }
 //Test.mq5
#include "Test.mqh"
#define ITERATIONS 1000000
#define MACRO( X ) \
        { \
                 ulong time = GetMicrosecondCount (); \
                 for ( int i= 0 ; i<ITERATIONS; i++) \
                { \
                         string r = string ( rand ); \
                        sum_ ##X += by_ ##X(r); \
                } \
                time_ ##X = GetMicrosecondCount () - time; \
        }
void OnStart ()
{
         for ( int i = 0 ; i < 10 ; i++ )
                OnStart2( rand ());
}
void OnStart2( int rand )
{
         long time_ref, sum_ref = 0 ;
         long time_val, sum_val = 0 ;
        MACRO( ref )
        MACRO( val )
         printf ( "%+10.3f:%d" , (time_ref-time_val)/ 1000.0 , sum_ref-sum_val );
}

sonra Sonuç (çalışma zamanı farkı):

+12.221:0
+5.099:0
+0.149:0
-13.729:0
+14.531:0
-27.429:0
+26.405:0
-0.839:0
+5.400:00
-4.882:0

küçük sınırlar içinde alternatifler (+\-)

 
A100 :

Nereden geliyor?

 #define ITERATIONS 1000000

void OnStart ()
{
   string Str = "1" ;
   
   for ( int i = 0 ; i < 10 ; i++)
     Str += Str;
   
   for ( int j = 0 ; j < 5 ; j++)
   {
     {
         ulong time = GetMicrosecondCount ();
         ulong sum = 0 ;
         for ( int i= 0 ; i<ITERATIONS; i++){
           string r = string ( rand ()) + Str ;
           sum += by_ref(r);
        }
        time = GetMicrosecondCount () - time;
         printf ( "%s took %.3f milliseconds: sum=%dll" , "by_ref" , time/ 1000.0 , sum);
     }{
         ulong time = GetMicrosecondCount ();
         ulong sum = 0 ;
         for ( int i= 0 ; i<ITERATIONS; i++)
           sum += by_val( string ( rand ()) + Str );
        time = GetMicrosecondCount () - time;
         printf ( "%s took %.3f milliseconds: sum=%dll" , "by_val" , time/ 1000.0 , sum);
     }
     
     Print ( "" );
   }
}
//+------------------------------------------------------------------+

int by_ref( string &var){ return int (var) % 100 ; }
int by_val( string   var){ return int (var) % 100 ; }


by_ref took 15119.806 milliseconds: sum=- 1000000 ll
by_val took 13872.479 milliseconds: sum=- 1000000 ll

by_ref took 14433.781 milliseconds: sum=- 1000000 ll
by_val took 13817.533 milliseconds: sum=- 1000000 ll

by_ref took 13889.424 milliseconds: sum=- 1000000 ll
by_val took 14135.603 milliseconds: sum=- 1000000 ll

by_ref took 16047.643 milliseconds: sum=- 1000000 ll
by_val took 14494.432 milliseconds: sum=- 1000000 ll

by_ref took 15542.276 milliseconds: sum=- 1000000 ll
by_val took 13843.121 milliseconds: sum=- 1000000 ll
 
Nikolai Semko :

KB olarak derecelendirmek istedim ve işe yaramadı. Ve son yayınların hiç reyting almadığına bakılırsa, bu sorun sadece bende değil.

Evet, çalışmıyor.

 
fxsaber :
Referans ve val döngülerinde aynı koda sahibim (karşılaştırma az çok doğru), ancak sizinki farklı
 
A100 :
Referans ve val döngülerinde aynı koda sahibim (karşılaştırma az çok doğru), ancak sizinki farklı

Evet, farklı. Ama soru güncelliğini koruyor. Val sürümü neden referanstan belirgin şekilde daha hızlı?

 
fxsaber :

Evet, farklı. Ama soru güncelliğini koruyor. Val sürümü neden referanstan belirgin şekilde daha hızlı?

belki de ref varyantı derleyici tarafından daha kötü optimize edilmiştir - kim bilir.

bana gelince, her iki seçenek de yaklaşık olarak aynı kodda, hatta tamamen aynı şekilde derlenmeli, ancak derleyici farklı düşünüyor

 
TheXpert :

belki de ref varyantı derleyici tarafından daha kötü optimize edilmiştir - kim bilir.

bana gelince, her iki seçenek de yaklaşık olarak aynı kodda, hatta tamamen aynı şekilde derlenmeli, ancak derleyici farklı düşünüyor

Soru aslında geliştiricilerin tutarsızlıkların nedenlerini ortadan kaldırmak için bir temele sahip olması için tasarlandı.

Genellikle hız için her şeyi referans olarak geçmeye çalışırım. Ve bazı yapılarda haklıydı. Ama şimdi öyle görünüyor.

 
Alexey Kozitsyn :

+1. Bir şey kırılmış gibi görünüyor. 1881 x64 oluşturun. 10 kazanın. Başlangıçta %20+ (i5 8600k) ve 650-700 MB RAM (artış olmadan) yükler.

Görev yöneticisinde durum "Yanıt Vermiyor".

Ayrıca, diğer terminal 1881 (Açılmıyor) normal şekilde başlar.

Katma:

Sonunda, hala yüklendi. Ancak indirme işlemi çok uzun sürdü - bu normal değil. Sonra terminali kapattım ve tekrar açtım. Anında açıldı. Görünüşe göre, verileri yüklerken bazı sorunlar vardı.

Terminali yeniden kurarak çözdüm. Üstelik tüm ayarları ve grafikleri içeren klasörü yanlışlıkla yıktım) Her şeyi yeniden çizdim ama şimdi saat gibi çalışıyor.
 
reztor :
Terminali yeniden yükleyerek çözdüm. Üstelik tüm ayarları ve grafikleri içeren klasörü yanlışlıkla yıktım) Her şeyi yeniden çizdim ama şimdi saat gibi çalışıyor.

Bu gerekli değildi. News.dat dosyasını silmiş olabilirsin.

 
TheXpert :

belki de ref varyantı derleyici tarafından daha kötü optimize edilmiştir - kim bilir.

bana gelince, her iki seçenek de yaklaşık olarak aynı kodda, hatta tamamen aynı şekilde derlenmeli, ancak derleyici farklı düşünüyor

Ve son kod ile yürütme süresi arasındaki bağlantı nedir?

Örneğin, değişelim ... öyle ki döngüler tamamen aynı olsun

 #define ITERATIONS 1000000
void OnStart ()
{
   string Str = "1" ;
   for ( int i = 0 ; i < 10 ; i++)
     Str += Str;
   for ( int j = 0 ; j < 5 ; j++)
   {
     {
         ulong time = GetMicrosecondCount ();
         ulong sum = 0 ;
         for ( int i= 0 ; i<ITERATIONS; i++)
           sum += by_ref( string ( rand ()) + Str);
        time = GetMicrosecondCount () - time;
         printf ( "%s took %.3f milliseconds: sum=%dll" , "by_ref" , time/ 1000.0 , sum);
     }
     {
         ulong time = GetMicrosecondCount ();
         ulong sum = 0 ;
         for ( int i= 0 ; i<ITERATIONS; i++)
           sum += by_val( string ( rand ()) + Str);
        time = GetMicrosecondCount () - time;
         printf ( "%s took %.3f milliseconds: sum=%dll" , "by_val" , time/ 1000.0 , sum);
     }    
     Print ( "" );
   }
}
int by_ref( string var){ return int (var) % 100 ; }
int by_val( string  var){ return int (var) % 100 ; }

Sonuç:

by_ref 18354.547 milisaniye sürdü: toplam=1865600ll
by_val 18318.319 milisaniye sürdü: toplam=1861628ll

by_ref 18416.747 milisaniye sürdü: toplam=1904488ll
by_val 18221.978 milisaniye sürdü: toplam=1907860ll

by_ref 18301.009 milisaniye sürdü: toplam=1757988ll
by_val 18545.258 milisaniye sürdü: toplam=1949720ll

by_ref 18373.648 milisaniye sürdü: toplam=1867160ll
by_val 17972.432 milisaniye sürdü: toplam=1760308ll

by_ref 19426.076 milisaniye aldı: toplam=1795564ll
by_val 19177.485 milisaniye sürdü: toplam=1826360ll

yaklaşık aynı ... yoksa derleyicinin aynı döngülerde farklı kodlar oluşturduğunu mu düşünüyorsunuz?

olduğunu hatırlatayım

by_ref 1389.424 milisaniye sürdü: toplam=- 1000000 ll
by_val 14135,603 milisaniye sürdü: toplam=- 1000000 ll

ve farklı kod... ve burada yaklaşık aynı zaman farkı var, ancak kod ve işlevlerin kendileri tamamen aynı