MQL5'te OOP hakkında sorular - sayfa 65

 
Sergey Dzyublik :

Yapılar ve sınıflar hakkında bir şey unuttunuz (yeni olmadan) - ikisi de yığında tahsis edilmiştir.

C ++ ile karıştırmayın, burada her şey daha keskin

 
Maxim Kuznetsov :

C ++ ile karıştırmayın, burada her şey daha keskin

Bunlar senin hayallerin, gerçek değil.
Kendiniz test etmediğiniz şeyi kanıtlamayın...
Yığın üzerinde, yapı ve sınıf nesneleri (yeni olmadan) şeklinde yerel değişkenlerin oluşturulması gerçekleşir.
+-dizilerinin MT5'te nasıl çalıştığı daha önce anlatılmıştı .

 
Dmitry Fedoseev :

Tam bir serseri!

1 - bir nesnenin yaratılması yoluyla. 2 - sadece normal bir işlev çağrısı yoluyla. İlk sayı milisaniye cinsinden süredir, ikincisi yoksayılır.

Zaten neredeyse 10 kat daha hızlı (ve bazen 10 kattan fazla). Ne üzüntü ... bir yığın ... bir demet ... *** cha

Peki, neden dikkat etmiyorsun? Tahmin edeyim: INT_MAX bir kez geçici bir nesne yaratarak bir eylem gerçekleştirdi ve ardından aynı eylemi bir işlev çağrısı yoluyla mı gerçekleştirdi?

Genel olarak, beklenen sonuç, çalışma zamanında bir sınıfın oluşturulması etrafında bir tef ile danslar olduğu göz önüne alındığında (belirli bir kaptaki bir dizine çok benzeyen bu tutamaca ihtiyacınız var).

not. Oynamak için kaynaklar nerede?

P.P.S. İşlevin çağrıldığından emin misiniz? Yine de, bu kodda bir optimize edici var, işlevin çalışma zamanında çağrılacağı bir gerçek değil:

 for ( int i= 0 ;i< 500 ;++i){
   int x=Get(i);}

int Get( int x) { return -x;}

UB'nin mql'de var olduğu gerçeği şu kodla kanıtlanmıştır:

 void OnStart (){
   Print (Test()? "Ok" : "No" );
}

bool Test ( void )
{
   const int MAX = 1000 ;
   int a= 1 ,b= 1 ,c= 1 ;
   while ( 1 ) {
     if (((a*a*a) == ((b*b*b)+(c*c*c)))) return true ;
    a++;
     int x=Get(a);
     if (a>MAX) {
      a= 1 ;
      b++;
    }
     if (b>MAX) {
      b= 1 ;
      c++;
    }      
     if (c>MAX) {
      c= 1 ;
    }
  }
   return false ;
}
 
Vladimir Simakov :

UB'nin mql'de var olduğu gerçeği şu kodla kanıtlanmıştır:

Derleyiciyi akıllıca parmağınızın etrafında daire içine aldınız:
- while(1) döngüsünde herhangi bir kesinti olmadığı için yanlış dal atılır.
- true döndürülür, çünkü işlemler "dış dünya" ile herhangi bir etkileşim olmadan yerel değişkenler üzerinde yapılır ve bu kodun yürütülmesi de atılır.

 
Sergey Dzyublik :

Derleyiciyi akıllıca parmağınızın etrafında daire içine aldınız:
- while(1) döngüsünde herhangi bir kesinti olmadığı için yanlış dal atılır.
- true döndürülür, çünkü işlemler "dış dünya" ile herhangi bir etkileşim olmadan yerel değişkenler üzerinde yapılır ve bu kodun yürütülmesi de atılır.

Bu ben değilim - bu internetteki örneklerden biri. Artıları ile bire bir.

 
Vladimir Simakov :

Peki, neden dikkat etmiyorsun? Dur tahmin edeyim: INT_MAX bir kez geçici bir nesne yaratarak bir eylem gerçekleştirdi ve ardından aynı eylemi bir işlev çağrısı yoluyla mı gerçekleştirdi?

Genel olarak, beklenen sonuç, çalışma zamanında bir sınıfın oluşturulması etrafında bir tef ile danslar olduğu göz önüne alındığında (belirli bir kaptaki bir dizine çok benzeyen bu tutamaca ihtiyacınız var).

not. Oynamak için kaynaklar nerede?

P.P.S. İşlevin çağrıldığından emin misiniz? Yine de, bu kodda bir optimize edici var, işlevin çalışma zamanında çağrılacağı bir gerçek değil:

UB'nin mql'de var olduğu gerçeği şu kodla kanıtlanmıştır:

Yanlış tahmin. Burada tahmin etmeye gerek yok, ancak dünü hatırlamanız yeterli, hafıza ile ilgili sorunlar olması durumunda, konuşmanın ne hakkında olduğunu tırnak işaretleri ile görebilirsiniz. Daha önce tam tersini iddia ettiyseniz, sonuç neden aniden beklendi?

Evet, işlevin çağrıldığından eminim. Hepiniz benim aptal olduğumu hayal etmeyi çok mu seviyorsunuz? Soru neden sadece fonksiyonla ilgili, ya da nesne de yaratılmamış olabilir mi? Yoksa tüm derleyicilerin nasıl çalıştığını bildiğinizden o kadar emin misiniz?

 
Sergey Dzyublik :

Ne hakkında olduğunu açıklayabilir misin, yoksa biraz aptalım, üç kez okudum - ama hiçbir şey anlamadım ...

Konuşmanın ne hakkında olduğuyla ilgili alıntılara bakın. Alıntı yaptığım ve buna karşılık olarak alıntıdan bu cevabı aldım.

 
ve herhangi bir konuşmayı bu tür saçmalıklara yönlendiriyorsunuz ... yığın hakkında, dizi dizisi hakkında ... "yığın üzerinde" ile yaptığınız açıklama işe yaramıyor.
 

Dmitry kodunu göndermekten utandığı için 15 dakikasını aldı. testler ver.

Hata. Aynı eylemlerle, fark sadece %30 idi.

 class CTest{
   static uint count;
   static double temp;
   int i;
public :
   CTest( int _x):i(_x){++count; temp+=( double ) GetMicrosecondCount (); temp/=count;}
   ulong Get() { return GetMicrosecondCount ()+i;}
   static uint Count()  { return count;}
   static double Temp() { return temp;}
};

int i= 1 ;
double temp;

uint CTest::count= 0 ;
double CTest::temp= 0.0 ;

void OnStart (){
   ulong t= GetMicrosecondCount ();
   for (;i< 1000001 ;++i){
      temp+=( double )CTest(i).Get();
      temp/=i;}
   ulong _t= GetMicrosecondCount ()-t;
   Print (_t, " | " ,i);
   Print (CTest::Count());
   Print (CTest::Temp());
   t= GetMicrosecondCount ();
   for (;i< 2000001 ;++i){
      temp+=( double )Test(i);
      temp/=i;}
   _t= GetMicrosecondCount ()-t;
   Print (_t, " | " ,i);
   Print (temp);
}

ulong Test( int x) {
   static uint count= 0 ;
   static double _temp= 0.0 ;
   ++count;
   _temp+=( double ) GetMicrosecondCount ();
   _temp/=count;
   return GetMicrosecondCount ()+x;}

Yürütme süresindeki fark, statik değişkenler ve alanlar ile tüm bu hareketler olmadan da devam eder. Yüzde değil, mikrosaniye cinsinden farktır.

Sonuç: yığında geçici bir nesne oluşturmanın maliyeti oldukça küçüktür, en hızlı bilgisayarımda değil, yaklaşık 30-40 ns / adet (nanosaniye) idi, bu nedenle çoğu durumda, dikkat edin onlara.

not. Ve geliştiriciler hakkında kötü düşündüm, ama hayır, sadece insanların sözlerini alıp kontrol etmemelisiniz)))

 
Vladimir Simakov :

Dmitry kodunu göndermekten utandığı için 15 dakikasını aldı. testler ver.

Hata. Aynı eylemlerle, fark sadece %30 idi.

Yürütme süresindeki fark, statik değişkenler ve alanlar ile tüm bu hareketler olmadan da devam eder. Yüzde değil, mikrosaniye cinsinden farktır.

Sonuç: yığında geçici bir nesne oluşturmanın maliyeti oldukça küçüktür, en hızlı bilgisayarımda değil, yaklaşık 30-40 ns / parça (nanosaniye) idi, bu nedenle çoğu durumda bunlara dikkat edin .

not. Ve geliştiriciler hakkında kötü düşündüm, ama hayır, sadece insanların sözlerini alıp kontrol etmemelisiniz)))

Ve dahası, içeride her türlü farklı hesaplamayı yapın, fark daha da az olacaktır. Ve genel olarak, bu test neredeyse aynı işlevsellik testi olarak adlandırılamaz.

Ayrıca, testlerin kendileri aynı değildir.