Ошибки, баги, вопросы - страница 2195

 
Artyom Trishkin:

Привет от fxsaber:

А можно картинку увидеть - что он (код) делает?

 

Просьба объяснить, почему ArrayResize работает очень медленно с Reserve-заданием?

Скрипт

// Добавление элемента в конец произвольного массива
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(1e7, 1e5)); // 100 раз выделяется память
  BENCH(Bench(1e7, 1e6)); //  10 раз выделяется память
  BENCH(Bench(1e7, 1e7)); //   1 раз выделяется память
}


Результат

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


100 раз выделение памяти (от 5 Mb до 500 Mb) отнимает 38 секунд. Это нормально?

Практическое применение идет в кастомных символах, когда нужно подготовить тиковую историю перед импортом. Допустим, в локальном хранилище есть сколько-то CSV-файлов с тиковыми данным, необходимо из них составить MqlTick-массив. Как это сделать оптимальным способом? Заранее посчитать количество тиков в этих файлах нельзя.

 
fxsaber:

Заранее посчитать количество тиков в этих файлах нельзя.

Поделить размер файла на примерный размер одного тика?

 
Andrey Khatimlianskii:

Поделить размер файла на примерный размер одного тика?

К сожалению, не знаю размеры файлов - CSV распаковываю из ZIP.

 
Rashid Umarov:

А можно картинку увидеть - что он (код) делает?

Сделать скрин за выбранной промежуток времени оказалось сложной задачей - может есть правильное решение определения ширины, что б захватить бары по двум диапазонам дат включительно?

 
Aleksey Vyazmikin:

Сделать скрин за выбранной промежуток времени оказалось сложной задачей - может есть правильное решение определения ширины, что б захватить бары по двум диапазонам дат включительно?

Какие-же сложности??? Вот одним скриптом сделаны 2 скрина с разным масштабом так чтобы на скрине было 30 баров от указанной даты.

  

 
fxsaber:

К сожалению, не знаю размеры файлов - CSV распаковываю из ZIP.

А куда они деваются из ZIP? В массив? В строку? У них же тоже есть размер/длина.

 
Alexey Viktorov:

Какие-же сложности??? Вот одним скриптом сделаны 2 скрина с разным масштабом так чтобы на скрине было 30 баров от указанной даты.

  

Поставьте зум на ноль, даже сейчас видно, что на втором скрине уже бар впритык, в отличии от первого.

И что такое 30 баров, давайте 600!
 
Andrey Khatimlianskii:

А куда они деваются из ZIP? В массив? В строку? У них же тоже есть размер/длина.

Тогда мне придется все распаковать и хранить в памяти сотни мегабайт распакованного.

Либо же распаковать, складывая количество строк (строка - тик). Экономя на памяти. А потом заново распаковывать, но уже с парсингом.