Erreurs, bugs, questions - page 2195

 

Veuillez expliquer pourquoi ArrayResize est très lent avec une tâche de réserve?

Script

// Добавление элемента в конец произвольного массива
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 раз выделяется память
}


Résultat

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


Une allocation de mémoire de 100 fois (5 Mb à 500 Mb) prend 38 secondes. Est-ce normal ?

L'application pratique est dans les caractères personnalisés, lorsque vous voulez préparer un historique des tics avant l'importation. Supposons qu'il y ait des fichiers CSV avec des données de tick dans le stockage local, et que vous ayez besoin d'en faire un tableau MqlTick. Comment le faire de manière optimale ? Il est impossible de calculer à l'avance le nombre de ticks dans ces fichiers.

 
Rashid Umarov:

Pouvons-nous voir une image - que fait-il (le code) ?

 
fxsaber:

Il n'est pas possible de calculer à l'avance le nombre de ticks dans ces fichiers.

Divisez la taille du fichier par la taille approximative d'une tique ?

 
Andrey Khatimlianskii:

Divisez la taille du fichier par la taille approximative d'une tique ?

Malheureusement, je ne connais pas la taille des fichiers - je décompresse le CSV à partir d'un ZIP.

 
Rashid Umarov:

Peut-on voir une image - que fait-elle ?

Faire une capture d'écran sur une période de temps sélectionnée s'est avéré difficile - peut-être existe-t-il une solution de définition de largeur appropriée pour capturer les barres sur deux plages de dates incluses ?

 
Aleksey Vyazmikin:

Faire une capture d'écran sur une période de temps sélectionnée s'est avéré difficile - existe-t-il une solution de définition de largeur appropriée pour capturer les barres sur les deux plages de dates incluses ?

Quelle est la difficulté ? J'ai fait 2 captures d'écran avec des échelles différentes dans un script afin que la capture d'écran montre 30 barres à partir de la date spécifiée.


 
fxsaber:

Malheureusement, je ne connais pas la taille des fichiers - je décompresse le CSV à partir du ZIP.

Où vont-ils à partir de ZIP ? Dans un tableau ? A une corde ? Ils ont aussi une taille/longueur.

 
Alexey Viktorov:

Quelles sont les difficultés ? Voici un script qui a fait 2 captures d'écran avec une échelle différente pour que l'écran affiche 30 barres à partir de la date spécifiée.


Mettez le zoom à zéro, même maintenant vous pouvez voir que dans la deuxième capture d'écran la barre est déjà serrée, contrairement à la première.

Et qu'est-ce que 30 barres, faisons-en 600 !
 
Andrey Khatimlianskii:

Où vont-ils à partir du ZIP ? Dans un tableau ? A une corde ? Ils ont aussi une taille/longueur.

Ensuite, je devrais tout décompresser et garder en mémoire des centaines de mégaoctets de choses déballées.

Ou déballer en additionnant le nombre de chaînes (chaîne - tic). Sauvegarde en mémoire. Et puis décompresser à nouveau, mais avec l'analyse syntaxique.

 

Zoom==5

5

Zoom==4

4

Zoom==3


Zoom==2


Zoom==1

Zoom==0