Fehler, Irrtümer, Fragen - Seite 2195

 
Artyom Trishkin:

Grüße von fxsaber:

Können wir ein Bild sehen - was macht er (der Code)?

 

Bitte erklären Sie, warum ArrayResize mit einem Reserve-Task sehr langsam ist?

Drehbuch

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


Ergebnis

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


Die 100-fache Speicherzuweisung (5 Mb bis 500 Mb) dauert 38 Sekunden. Ist das normal?

Praktische Anwendung findet dies bei benutzerdefinierten Zeichen, wenn Sie vor dem Import eine Tick-Historie erstellen möchten. Angenommen, es gibt einige CSV-Dateien mit Tick-Daten im lokalen Speicher, und Sie müssen ein MqlTick-Array von ihnen machen. Wie kann man dies optimal tun? Es ist unmöglich, die Anzahl der Ticks in diesen Dateien im Voraus zu berechnen.

 
Rashid Umarov:

Können wir ein Bild sehen - was macht er (der Code)?

 
fxsaber:

Es ist nicht möglich, die Anzahl der Ticks in diesen Dateien im Voraus zu berechnen.

Teilen Sie die Dateigröße durch die ungefähre Größe einer Zecke?

 
Andrey Khatimlianskii:

Teilen Sie die Dateigröße durch die ungefähre Größe einer Zecke?

Leider kenne ich die Dateigrößen nicht - ich entpacke die CSV aus einer ZIP-Datei.

 
Rashid Umarov:

Kann ich ein Bild sehen - wie funktioniert es?

Es hat sich als schwierig erwiesen, einen Screenshot über einen ausgewählten Zeitraum zu erstellen - vielleicht gibt es eine Lösung zur Definition der richtigen Breite, um die Balken über die beiden Datumsbereiche einschließlich zu erfassen?

 
Aleksey Vyazmikin:

Es hat sich als schwierig erwiesen, einen Screenshot über einen ausgewählten Zeitraum zu erstellen - gibt es eine geeignete Lösung zur Definition der Breite, um die Balken über die beiden Datumsbereiche einschließlich zu erfassen?

Worin besteht die Schwierigkeit? Ich habe 2 Screenshots mit unterschiedlichen Skalen in einem Skript erstellt, so dass der Screenshot 30 Balken ab dem angegebenen Datum zeigt.


 
fxsaber:

Leider kenne ich die Dateigrößen nicht - ich dekomprimiere die CSV-Datei aus der ZIP-Datei.

Wohin gehen sie von ZIP? In ein Array? Zu einer Schnur? Sie haben auch eine Größe/Länge.

 
Alexey Viktorov:

Was sind die Schwierigkeiten? Hier ist ein Skript gemacht 2 Screenshot mit unterschiedlichen Maßstab, so dass auf dem Bildschirm war 30 Bars aus dem angegebenen Datum.


Stellen Sie den Zoom auf Null. Schon jetzt können Sie sehen, dass der Balken auf dem zweiten Screenshot im Gegensatz zum ersten Bild bereits dicht ist.

Und was sind schon 30 Balken, machen wir doch 600 daraus!
 
Andrey Khatimlianskii:

Wohin gehen sie vom ZIP aus? In ein Array? Zu einer Schnur? Sie haben auch eine Größe/Länge.

Dann müsste ich alles dekomprimieren und Hunderte von Megabyte an entpacktem Material im Speicher behalten.

Oder entpacken Sie, indem Sie die Anzahl der Strings addieren (String - Tick). Einsparung von Speicherplatz. Und dann wieder dekomprimieren, aber mit Parsing.