MQL5'te OOP hakkında sorular - sayfa 69

 
fxsaber :
Beklenmedik bir sonuç aldı.


IMHO, testler karşılaştırılamaz

STRUCT2'nin bir kurucusu var

STRUCT2'nin dizeleri var

https://www.mql5.com/en/forum/1111/page2732#comment_16181920 tartışılan MQL'de uygulanan dizeler hakkında hiçbir belge yoktur


onlar. testinizde, STRUCT2, bir kurucu ile bir "string sınıfı" içeren bir kurucu ile bir sınıf olarak çalışır; bu, özünde nesne için birkaç kez bellek tahsis eder.

Böyle karmaşık bir testin birkaç teste bölünmesi gerektiğini düşünüyorum - STRUCT1 ve STRUCT2 yapılarının oluşturulma süresini ve ardından veri erişim süresini test etmek için geliştiricilerden biri, bir dizenin belleğinin yalnızca dizeye eriştikten sonra tahsis edildiğini yazdı. - sizin örneğinizde, dize genellikle sabit bir dizeyle başlatılır, başlatmanın nasıl gerçekleştiğini tahmin etmek zordur - derleyici, dize dizilerine erişmeden önce hiç başlatamadı (veya bellek ayıramadı?)

 
Igor Makanu :

Böyle karmaşık bir testin birkaç teste bölünmesi gerektiğini düşünüyorum.

Uğraşmak bile istemiyorum. Basit yapılar yaptı.

 #include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

// Простая структура.
struct STRUCT1
{
   int i;
   double j[ 2 ];
};

// Простая структура большего размера.
struct STRUCT3
{
   int i;
   double j[ 10 ];
};

template < typename T>
int Func( T &Array[] )
{  
   // Write
   for ( int i = ArraySize (Array) - 1 ; i >= 0 ; i--)
    Array[i].i = i;

   int Sum = 0 ;
  
   // Read
   for ( int i = ArraySize (Array) - 1 ; i >= 0 ; i--)
    Sum += Array[i].i;
    
   return (Sum + ArraySize (Array));    
}

#include <Debug.mqh>

void OnStart ()
{
  STRUCT1 Array1[]; // Простая структура.
  STRUCT3 Array3[]; // Простая структура большего размера.
  
   const int Amount = 5 e7;
  
   Print (_B( ArrayResize (Array1, Amount), 1 ));
   Print (_B( ArrayResize (Array3, Amount), 1 ));
      
   Print (_B(Func(Array1), 1 )); // Чтение и запись простой структуры
   Print (_B(Func(Array3), 1 )); // зависит от ее размеров.
  
  _P2( sizeof (STRUCT1));
  _P2( sizeof (STRUCT3));
}


         50000000
         50000000
         Alert : Time[Test6.mq5 280 : Func(Array1)] = 312 ms.
         1333106752
         Alert : Time[Test6.mq5 281 : Func(Array3)] = 1348 ms.
         1333106752
        : sizeof (STRUCT1) = 20
        : sizeof (STRUCT3) = 84


Basit bir yapının ilk alanına hangi nedenle erişim, büyüklüğüne bağlıdır - açık değildir.

 
fxsaber :

Uğraşmak bile istemiyorum. Basit yapılar yaptı.



Basit bir yapının ilk alanına hangi nedenle erişim, büyüklüğüne bağlıdır - açık değildir.

Bu soruyu geliştiricilere uygun başlıkta sormak daha iyidir. test kodu ile Ya açıklayacaklar, ya düzeltecekler ya da hiçbir şey söylemeyecekler... Burada, elbette, sadece üçüncü seçenek.

 
Artyom Trishkin :

Bu soruyu geliştiricilere uygun başlıkta sormak daha iyidir. test kodu ile Ya açıklayacaklar, ya düzeltecekler ya da hiçbir şey söylemeyecekler... Burada, elbette, sadece üçüncü seçenek.

MT5'im neden olamayacak kadar çok küfür haline geldi. Kritik hatalar var. Bu saçmalık.

 
fxsaber :

Uğraşmak bile istemiyorum. Basit yapılar yaptı.

şimdi aynı testler STRUCT1 ve STRUCT3

fxsaber :

Basit bir yapının ilk alanına hangi nedenle erişim, büyüklüğüne bağlıdır - açık değildir.

burada sadece kahve telvesi üzerine tahmin

bir seçenek olarak , aynı testi C++'da yapacak ve sonuçları gösterecek birini bekleyin , eğer büyük bir tutarsızlık varsa, MQL'de bellek tahsisi zayıf bir şekilde uygulanır

1. ve 2. testler yaklaşık olarak aynıysa, Windows belleği bu şekilde ayırır

 
fxsaber :

MT5'im neden olamayacak kadar çok küfür haline geldi. Kritik hatalar var. Bu saçmalık.

Lütfen tüm hataları bildirin. Kritik ve hayır. Duygusuz tabii :)

 
Igor Makanu :

1. ve 2. testler yaklaşık olarak aynıysa, Windows belleği bu şekilde ayırır

son testi 2 kez çalıştır

terminal MetaQuotes Software Corp için MetaTrader 5 x64 build 2470 başladı.

Windows 10 build 18363, Intel Core i3-4170 @ 3.70GHz, 8/11 Gb bellek, 188/297 Gb disk, IE 11, UAC, GMT+4

2020.05.30 17:01:27.996 tst_f (EURUSD,H1) Uyarı: Zaman[tst_f.mq5 53: ArrayResize (Array1,Amount)] = 1 ms.

2020.05.30 17:01:27.996 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:28.002 tst_f (EURUSD,H1) Uyarı: Zaman[tst_f.mq5 54: ArrayResize(Array3,Amount)] = 6 ms.

2020.05.30 17:01:28.002 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:28.515 tst_f (EURUSD,H1) Uyarı: Zaman[tst_f.mq5 56: Func(Array1)] = 512 ms.

2020.05.30 17:01:28.515 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:30.734 tst_f (EURUSD,H1) Uyarı: Zaman[tst_f.mq5 57: Func(Array3)] = 2218 ms.

2020.05.30 17:01:30.734 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:41.278 tst_f (EURUSD,H1) Uyarı: Zaman[tst_f.mq5 53: ArrayResize(Array1,Amount)] = 2 ms.

2020.05.30 17:01:41.278 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:41.287 tst_f (EURUSD,H1) Uyarı: Zaman[tst_f.mq5 54: ArrayResize(Array3,Amount)] = 9 ms.

2020.05.30 17:01:41.287 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:41.840 tst_f (EURUSD,H1) Uyarı: Zaman[tst_f.mq5 56: Func(Array1)] = 552 ms.

2020.05.30 17:01:41.840 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:43.728 tst_f (EURUSD,H1) Uyarı: Zaman[tst_f.mq5 57: Func(Array3)] = 1888 ms.

2020.05.30 17:01:43.728 tst_f (EURUSD,H1) 1333106752


komut dosyası için tüm dosyalar eklenmedi, son satırlar derlenmedi

   //_P2(sizeof(STRUCT1));
//  _P2(sizeof(STRUCT3));

Debug.mqh'yi dahil ettim


UPD: Eski yapı üzerinde bir test yaptım

2020.05.30 17:17:27.604 terminal MetaTrader 5 - 2361 oluştur



2020.05.30 17:13:17.046 tst (EURUSD,H1) Uyarı: Zaman[tst.mq5 53: ArrayResize(Array1,Amount)] = 1 ms.

2020.05.30 17:13:17.047 tst (EURUSD,H1) 50000000

2020.05.30 17:13:17.053 tst (EURUSD,H1) Uyarı: Zaman[tst.mq5 54: ArrayResize(Array3,Amount)] = 6 ms.

2020.05.30 17:13:17.053 tst (EURUSD,H1) 50000000

2020.05.30 17:13:17.563 tst (EURUSD,H1) Uyarı: Zaman[tst.mq5 56: Func(Array1)] = 510 ms.

2020.05.30 17:13:17.563 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:19.416 tst (EURUSD,H1) Uyarı: Zaman[tst.mq5 57: Func(Array3)] = 1852 ms.

2020.05.30 17:13:19.416 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:28.971 tst (EURUSD,H1) Uyarı: Zaman[tst.mq5 53: ArrayResize(Array1,Amount)] = 2 ms.

2020.05.30 17:13:28.971 tst (EURUSD,H1) 50000000

2020.05.30 17:13:28.977 tst (EURUSD,H1) Uyarı: Zaman[tst.mq5 54: ArrayResize(Array3,Amount)] = 6 ms.

2020.05.30 17:13:28.977 tst (EURUSD,H1) 50000000

2020.05.30 17:13:29.456 tst (EURUSD,H1) Uyarı: Zaman[tst.mq5 56: Func(Array1)] = 478 ms.

2020.05.30 17:13:29.456 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:31.192 tst (EURUSD,H1) Uyarı: Zaman[tst.mq5 57: Func(Array3)] = 1735 ms.

2020.05.30 17:13:31.192 tst (EURUSD,H1) 1333106752

benzer sonuçlar - aynı davranış
 
Ve reklamlarını yerlerde değiştirmeye çalışın. Hangisinin yığının başında olduğuna bağlı değil mi?
 
Artyom Trishkin :

Lütfen tüm hataları bildirin. Kritik ve hayır. Duygusuz tabii :)

Ayrıntılı konular oluşturuldu.

 
Vladimir Simakov :
Ve reklamlarını yer yer değiştirmeye çalışın. Hangisinin yığının başında olduğuna bağlı değil mi?
 void OnStart ()
{
  STRUCT3 Array3[]; // Простая структура большего размера.
  STRUCT1 Array1[]; // Простая структура.
  
  
   const int Amount = 5 e7;
  
   Print (_B( ArrayResize (Array3, Amount), 1 ));
   Print (_B( ArrayResize (Array1, Amount), 1 ));
  
      
   Print (_B(Func(Array3), 1 )); // зависит от ее размеров.
   Print (_B(Func(Array1), 1 )); // Чтение и запись простой структуры
  
   //_P2(sizeof(STRUCT1));
//  _P2(sizeof(STRUCT3));
}

2020.05.30 17:33:07.892 tst_f (EURUSD,H1) Uyarı: Zaman[tst_f.mq5 54: ArrayResize (Array3,Amount)] = 6 ms.

2020.05.30 17:33:07.955 tst_f (EURUSD,H1) 50000000

2020.05.30 17:33:07.957 tst_f (EURUSD,H1) Uyarı: Zaman[tst_f.mq5 55: ArrayResize(Array1,Amount)] = 1 ms.

2020.05.30 17:33:07.957 tst_f (EURUSD,H1) 50000000

2020.05.30 17:33:09.902 tst_f (EURUSD,H1) Uyarı: Zaman[tst_f.mq5 58: Func(Array3)] = 1945 ms.

2020.05.30 17:33:09.902 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:33:10.353 tst_f (EURUSD,H1) Uyarı: Zaman[tst_f.mq5 59: Func(Array1)] = 450 ms.

2020.05.30 17:33:10.353 tst_f (EURUSD,H1) 1333106752

bana göre değişen bir şey yok