Hatalar, hatalar, sorular - sayfa 2195

 
Artyom Trishkin :

fxsaber'dan merhaba:

Ve resmi görebilirsiniz - bu (kod) ne yapar?

 

Lütfen ArrayResize'ın Reserve işiyle neden çok yavaş olduğunu açıklayın?

Senaryo

 // Добавление элемента в конец произвольного массива
template < typename T>
void AddElement( T &Array[], const T &Value, const int Reserve = 0 )
{
   const int Size = :: ArraySize (Array);

  :: ArrayResize (Array, Size + 1 , Reserve);

  Array[Size] = Value;
}


#define BENCH(A)                                                              \
{                                                                             \
   const ulong StartTime = GetMicrosecondCount ();                              \
  A;                                                                          \
   Print ( "Time[" + #A + "] = " + ( string )( GetMicrosecondCount () - StartTime)); \
}

int Bench( const int Size, const int Reserve )
{
   const MqlTick NullTick = { 0 };
   MqlTick Ticks[];  
  
   for ( int i = 0 ; i < Size; i++)
    AddElement(Ticks, NullTick, Reserve);
    
   return ( ArraySize (Ticks));
}

void OnStart ()
{
  BENCH(Bench( 1 e7, 1 e5)); // 100 раз выделяется память
  BENCH(Bench( 1 e7, 1 e6)); //  10 раз выделяется память
  BENCH(Bench( 1 e7, 1 e7)); //   1 раз выделяется память
}


Sonuç

 Time [Bench( 1 e7, 1 e5)] = 38199494
Time [Bench( 1 e7, 1 e6)] = 3867983
Time [Bench( 1 e7, 1 e7)] = 479303


100 kez bellek ayırma (5 Mb'den 500 Mb'ye kadar) 38 saniye sürer. Bu iyi?

Pratik kullanım, içe aktarmadan önce bir onay geçmişi hazırlamanız gerektiğinde özel sembollerdedir. Diyelim ki yerel depoda kene verisi olan bazı CSV dosyaları var, bunlardan bir MqlTick dizisi yapmanız gerekiyor. En iyi şekilde nasıl yapılır? Bu dosyalardaki kene sayısını önceden hesaplamak mümkün değildir.

 
 
fxsaber :

Bu dosyalardaki kene sayısını önceden hesaplamak mümkün değildir.

Dosya boyutunu yaklaşık bir onay işareti boyutuna bölün?

 
Andrey Khatimlianskii :

Dosya boyutunu yaklaşık bir onay işareti boyutuna bölün?

Ne yazık ki dosya boyutlarını bilmiyorum - CSV'yi ZIP'den açıyorum.

 
Rashid Umarov :

Ve resmi görebilirsiniz - bu (kod) ne yapar?

Seçilen bir süre için bir ekran yapmak zor bir iş olduğu ortaya çıktı - belki de iki tarih aralığı dahil olmak üzere çubukları yakalamak için genişliği belirlemek için doğru bir çözüm var mı?

 
Aleksey Vyazmikin :

Seçilen bir süre için bir ekran yapmak zor bir iş olduğu ortaya çıktı - belki de iki tarih aralığı dahil olmak üzere çubukları yakalamak için genişliği belirlemek için doğru bir çözüm var mı?

Zorluklar nelerdir??? Burada tek script ile farklı ölçeklerde 2 ekran yapılmış, böylece ekranda belirtilen tarihten itibaren 30 bar yer almıştır.


 
fxsaber :

Ne yazık ki dosya boyutlarını bilmiyorum - CSV'yi ZIP'den açıyorum.

Ve ZIP'den nereye gidiyorlar? Bir diziye mi? Çizgide? Ayrıca bir boyutu/uzunluğu vardır.

 
Alexey Viktorov :

Zorluklar nelerdir??? Burada tek script ile farklı ölçeklerde 2 ekran yapılmış, böylece ekranda belirtilen tarihten itibaren 30 bar yer almıştır.


Yakınlaştırmayı sıfıra ayarlayın, şimdi bile ikinci ekranda çubuğun birinciden farklı olarak arka arkaya olduğunu görebilirsiniz.

Ve 30 bar nedir, hadi 600!
 
Andrey Khatimlianskii :

Ve ZIP'den nereye gidiyorlar? Bir diziye mi? Çizgide? Ayrıca bir boyutu/uzunluğu vardır.

O zaman her şeyi paketinden çıkarmam ve paketlenmemiş yüzlerce megabayt bellekte saklamam gerekecek.

Veya satır sayısını (satır - tik) ekleyerek paketi açın. Hafızadan tasarruf edin. Ve sonra yeniden açın, ancak ayrıştırma ile.