Hatalar, hatalar, sorular - sayfa 2667

 
Yani açıklanan hata geliştiriciler için ilginç değil, tamam...
 
MT5 hatası (2345 derlemesi) uzun süredir profil oluşturucunun neden başladığını ve çalıştığını anlayamadı, ancak sonuçlar hiçbir yerde görüntülenmiyor.
Komut dosyası projesi için profil oluşturucunun sonucu yalnızca optimizasyonun kapalı olduğu durumlarda gösterdiği, optimizasyon açıksa her şeyin başlayacağı, çalışacağı, ancak sonuçsuz olduğu ortaya çıktı.
 
Sergey Dzyublik :
MT5 hatası (2345 derlemesi) uzun süredir profil oluşturucunun neden başladığını ve çalıştığını anlayamadı, ancak sonuçlar hiçbir yerde görüntülenmiyor.
Komut dosyası projesi için profil oluşturucunun sonucu yalnızca optimizasyonun kapalı olduğu durumlarda gösterdiği, optimizasyon açıksa her şeyin başlayacağı, çalışacağı, ancak sonuçsuz olduğu ortaya çıktı.

Profil oluşturucu tüm göstergeler için çalışmaz (optimizasyon olmadan). Forumda iki kez yazdım, kodu LAN'daki geliştiricilere attım - cevap yok.

 
MT5'te profil oluşturucu ile çalıştı (2345 yapı),
Kabaca konuşursak, sonuçta aynı sonucu veren iki algoritmanın neden farklı hızlarda yürütüldüğüyle ilgilendim , optimizasyon modunda 1,7 kat düşüş.

 #include <stl_vector.mqh>

// TickCounts: 850
vector< int >::move test_vector_move_return_assign_by_index( int n){
   vector< int > v(n);
   for ( int i = 0 ; i < n; i++){
      v[i].UNREF  = i;
   }
   return v;
};

// TickCounts: 1450
vector< int >::move test_vector_move_return_push_back( int n){
   vector< int > v;
   // lazy implementation  
   v.reserve(n);                      
   for ( int i = 0 ; i < n; i++){
      v.push_back(i);
   }
   return v;
};


void OnStart ()
{
   for ( int i = 0 ; i < 20000 ; i++){
       vector< int > v_int_move = test_vector_move_return_assign_by_index( 1000 );
   }
   
   for ( int i = 0 ; i < 20000 ; i++){
      vector< int > v_int_move = test_vector_move_return_push_back( 1000 );
   }
}


Sonuç olarak, MT5 profil oluşturucu ile pratik deneyim elde edildi ve çalışmasında bir takım kusurlar bulundu.
Geliştiricilerin bu bilgilerle ilgilenip ilgilenmediği açık olmadığından ve hataları yerelleştirmek için saatlerce zaman harcamak istenmediğinden, yalnızca bulunan sorunlar hakkında kısa bilgiler verilecektir:

1) Farklı algoritmaların hızlarını karşılaştırmanın bir yolu yoktur.
Bu nedenle, hem optimizasyon etkinleştirilmiş hem de etkinleştirilmemiş olarak diğerlerinden üç kat daha hızlı olan bir algoritma, profil oluşturucudaki en yavaş olabilir.
Görünüşe göre, profil oluşturucu tarafında algoritmaların yürütme süresini etkileyen bir tür ek yük var, bu durumda profil oluşturucudaki algoritmaların hızını karşılaştırmanın bir anlamı yok.

2) Ekrandaki histogram araç ipuçlarında Yanlış Sayım değeri.
Profil oluşturucu, fonksiyonun beklendiği gibi 20K değil 80K kez çalıştırıldığını yazar, benzer şekilde farklı satırlar için fonksiyonun içinde bazen, bazı satırlar için üç kez, diğerleri için iki kez Count fazlalığı vardır.

3) Ekrandaki histogram araç ipuçlarında Yanlış Zaman değeri.
Profil oluşturucunun, algoritmanın zamanın% 99,90'ına girdiğini gösterdiği durumlar vardır, ancak gerçekte 20K'da yalnızca bir kez geçtiği ortaya çıktı.

 

Bu bir hata değil, bir not!


mt 5 yapı 2340.

Dün Veri Kataloğu'nu açtıktan sonra Göstergeler klasörünün Uzmanlar klasörüne nasıl taşındığını fark etmedim. Sonra MT5'i kapattım ve bugün açtım, göstergeler Navigator'dan da hiçbir şey olmamış gibi kullanılabilir. Ancak, Veri Kataloğu'nu tekrar açarsanız, orada Göstergeler boş bir klasör belirir ve içine zaten bir gösterge atarsanız. O zaman artık Gezgin'de görünmeyecektir. Göstergeler klasörünü MQL5\Indicators'a geri döndürmek sorunu çözer.

 

MT5 (derleme 2347) ArrayResize kullanarak diziye bir öğe eklerken, bunlar için bellek önceden ayrılmışsa neden bu kadar büyük bir ek yük?

 #define K 1000
#define M ( 1000 * K)

#define   SpeedTest(test_count,msg,EX)        { uint mss= GetTickCount (); ulong count=test_count; for ( ulong ii= 0 ;ii<count&&! _StopFlag ;ii++){EX;} \
                                               printf ( "%-60s: loops=%i ms=%u" ,msg,count, GetTickCount ()-mss);}
                                              
class A{
public :
   int data;
};

struct B{
   int data;
};

template < typename T>
void test1( const int test_count, const int array_size){
   SpeedTest(
   test_count, "Test Class ArrayResize all" ,
   {
      T class_array[];
       for ( int i = 1 ; i <= array_size; i++){
         ArrayResize (class_array, array_size);
      }
   }
   )
};

template < typename T>
void test2( const int test_count, const int array_size){
   SpeedTest(
   test_count, "Test Class ArrayResize one by one with reserved memory" ,
   {
      T class_array[];
       ArrayResize (class_array, 1 , array_size - 1 );
       for ( int i = 2 ; i <= array_size; i++){
         ArrayResize (class_array, i);
      }
   }
   )
};

void OnStart ()
{
   const int test_count = 5 *K;
   const int array_size = 5 *K;  
  
  test1< int >(test_count, array_size);             // Avg time: 100
  test2< int >(test_count, array_size);             // Avg time: 190
  test1< int >(test_count, array_size);
  test2< int >(test_count, array_size);
  test1< int >(test_count, array_size);
  test2< int >(test_count, array_size);
  test1< int >(test_count, array_size);
  test2< int >(test_count, array_size);
  
printf ( "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" );
  test1<A>(test_count, array_size);               // Avg time: 810
  test2<A>(test_count, array_size);               // Avg time: 1460
  test1<A>(test_count, array_size);
  test2<A>(test_count, array_size);
  test1<A>(test_count, array_size);
  test2<A>(test_count, array_size);
  test1<A>(test_count, array_size);
  test2<A>(test_count, array_size);
  
printf ( "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" );
  test1<B>(test_count, array_size);               // Avg time: 110
  test2<B>(test_count, array_size);               // Avg time: 770
  test1<B>(test_count, array_size);
  test2<B>(test_count, array_size);
  test1<B>(test_count, array_size);
  test2<B>(test_count, array_size);
  test1<B>(test_count, array_size);
  test2<B>(test_count, array_size);
}

Lütfen ArrayResize kullanarak dahili rezervasyon algoritmasını iyileştirmeyi düşünün.

Örneğin, sınıflar için, yapıcıyı çağırmanın yanı sıra, bir tür "listelerde dahili kayıt" gerçekleştirdiklerini varsayabilirsiniz.
ArrayResize kullanarak rezervasyonun bir parçası olarak, doğrudan bellek ayırmaya ek olarak, süreci optimize etmeyi deneyebilirsiniz:
- oluşturulan komşu bir öğeden veri alın (örneğin, sanal işlevler tablosuna bir işaretçi);
- henüz oluşturulmamış sınıfların "iç kaydı" için avans veya alan ayırma;

 
Sergey Dzyublik :

MT5 (derleme 2347) ArrayResize kullanarak diziye bir öğe eklerken, bunlar için bellek önceden ayrılmışsa neden bu kadar büyük bir ek yük?

Bu bile yardımcı olmuyor.

       ArrayResize (class_array, 1 , array_size - 1 );
       for ( int i = 0 ; i < array_size; i++){
//         ArrayResize(class_array, i);
         ArrayResize (class_array, i , array_size - 1 );

Biraz saçmalık. Fren ivmesi yerine.


ZY Bu garip, Documentation zero'dan bir örneğin yürütülmesinin sonucu.

--- Test Fast: ArrayResize (arr, 100000 , 100000 )
1 . ArraySize (arr)= 100000 Time= 0 ms
2 . ArraySize (arr)= 200000 Time= 0 ms
3 . ArraySize (arr)= 300000 Time= 0 ms
---- Test Slow: ArrayResize (slow, 100000 )
1 . ArraySize (slow)= 100000 Time= 0 ms
2 . ArraySize (slow)= 200000 Time= 0 ms
Документация по MQL5: Операции с массивами / ArrayResize
Документация по MQL5: Операции с массивами / ArrayResize
  • www.mql5.com
При успешном выполнении функция возвращает количество всех элементов, содержащихся в массиве после изменения размера; в противном случае возвращает -1 и массив не меняет размеры. Если ArrayResize() применена к статическому массиву, таймсерии или индикаторному буферу, то размер массива остается прежним – такие массивы не могут быть...
 
Sergey Dzyublik :
MT5'te profil oluşturucu ile çalıştı (2345 yapı),
Kabaca konuşursak, sonuçta aynı sonucu veren iki algoritmanın neden farklı hızlarda yürütüldüğüyle ilgilendim , optimizasyon modunda 1,7 kat düşüş.


...

Ne yazık ki, bu uzun süreli profil oluşturucu herhangi bir önemli proje için işe yaramaz. Bunu zaten bildirmeye çalıştım, ancak geliştiricilerden hiçbir ilgi yoktu.
 
Sergey Dzyublik :

MT5 (derleme 2347) ArrayResize kullanarak diziye bir öğe eklerken, bunlar için bellek önceden ayrılmışsa neden bu kadar büyük bir ek yük?

Karşılaştırmak isterseniz şöyle olmalı:

 void test1 ( const int test_count, const int array_size){
   SpeedTest(
   test_count,"Test Class ArrayResize all",
   {
      T class_array[];
       for ( int i = 0 ; i < array_size; i++){
         ArrayResize (class_array,  i );
      }
   }
   )
 
Alain Verleyen :

Karşılaştırmak isterseniz şöyle olmalı:

Benim açımdan, ne karşılaştırılmalıydı.
Diziye kaç elemanın yerleştirileceğini biliyorum ve hepsini bir kerede oluşturmak yerine, oluşturulmamış olanlar için bellek ayırıyorum.
Sorun şu ki, eğer bellek ayırırsam ve dizi öğelerini birer birer oluşturursam, o zaman her şeyi bir kerede oluşturmaktan çok daha fazla zaman alır.
Yani yapılar için - 7 kat daha yavaş.
Ve veri türleri için sınıf ve int iki kat daha yavaştır.

Bu çok büyük bir fark, bana öyle geliyor ki, istenirse geliştiriciler ortadan kaldırabilir.