Erros, bugs, perguntas - página 2195

 
Artyom Trishkin:

Saudações do fxsaber:

Podemos ver uma imagem - o que é que faz (o código)?

 

Por favor explique porque é que o ArrayResize é muito lento com uma tarefa de reserva?

Roteiro

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


Resultado

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


A atribuição de 100 vezes a memória (5 Mb a 500 Mb) leva 38 segundos. É normal?

A aplicação prática é em caracteres personalizados, quando se pretende preparar um histórico de tick antes da importação. Suponha que existem alguns ficheiros CSV com dados de tick no armazenamento local, e é necessário fazer um MqlTick-array dos mesmos. Como fazê-lo de uma forma óptima? É impossível calcular antecipadamente a quantidade de carraças nestes ficheiros.

 
Rashid Umarov:

Podemos ver uma imagem - o que é que faz (o código)?

 
fxsaber:

Não é possível calcular antecipadamente o número de carraças nestes ficheiros.

Dividir o tamanho do ficheiro pelo tamanho aproximado de um tick?

 
Andrey Khatimlianskii:

Dividir o tamanho do ficheiro pelo tamanho aproximado de um tick?

Infelizmente, não sei o tamanho dos ficheiros - Desembrulho o CSV a partir de um ZIP.

 
Rashid Umarov:

Podemos ver uma imagem - o que é que ela faz?

Fazer uma captura de ecrã durante um período de tempo seleccionado revelou-se difícil - talvez exista uma solução adequada de definição de largura para capturar as barras ao longo dos dois intervalos de datas, inclusive?

 
Aleksey Vyazmikin:

Fazer uma captura de ecrã durante um período de tempo seleccionado revelou-se difícil - existe uma solução adequada de definição de largura para capturar as barras ao longo dos dois intervalos de datas inclusive?

Qual é a dificuldade? Fiz 2 capturas de ecrã com escalas diferentes num único guião de modo a que a captura de ecrã mostre 30 barras a partir da data especificada.


 
fxsaber:

Infelizmente, não sei o tamanho dos ficheiros - descomprimo o CSV a partir do ZIP.

Para onde vão a partir do ZIP? Para uma matriz? A uma corda? Têm também um tamanho/comprimento.

 
Alexey Viktorov:

Quais são as dificuldades? Aqui está um guião feito 2 capturas de ecrã com escala diferente para que no ecrã houvesse 30 barras a partir da data especificada.


Ponha o zoom a zero, mesmo agora pode ver que no segundo ecrã a barra já está apertada, ao contrário do primeiro.

E o que são 30 barras, vamos fazer 600!
 
Andrey Khatimlianskii:

Para onde vão a partir do ZIP? Para uma matriz? A uma corda? Têm também um tamanho/comprimento.

Depois teria de descomprimir tudo e manter centenas de megabytes de coisas desempacotadas na memória.

Ou desempacotar somando o número de cordas (string - tick). Guardar na memória. E depois descomprimir novamente, mas com análise.