Posso fazer um brainstorming sobre uma rápida implementação da tradução de uma série de estruturas (comprimento múltiplo de tamanho do(int)) de e para uma série int[]?
A aplicação prática é a troca rápida de dados através de recursos. Minha variante é muito universal, por isso é mais lenta.
Estas funções apareceram no MT5
StructToCharArray
CharArrayToStruct
Eles não existem no MT4 e provavelmente não existirão. Portanto, temos que resolver o problema com e sem estas funções (se elas forem úteis).
O resultado será útil para um grande número de usuários do fórum aqui.
Escrevi um modelo muito simples de brainstorming com minha solução para este problema.
// Решения задачи: https://www.mql5.com/ru/forum/287618/page14#comment_9806429#define BENCH(A) \
{ \
constulong StartTime = GetMicrosecondCount(); \
A; \
Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}
// Инициализация исходных данныхint InitData( MqlTick &Ticks[], constint Amount = 1 e6, constdouble Price = 1.2345)
{
constint Size = ArrayResize(Ticks, Amount);
for (int i = 0; i < Size; i++)
Ticks[i].bid = Price;
return(Size);
}
MqlTick TicksIn[]; // Массив с исходными данными.constint Init = InitData(TicksIn); // Инициализировали его.// Проверка, что два массива совпадают.bool IsCompare( constMqlTick &Ticks1[], constMqlTick &Ticks2[] )
{
constint Size = ArraySize(Ticks1);
bool Res = (Size == ArraySize(Ticks2));
for (int i = 0; (i < Size) && Res; i++)
Res = (Ticks1[i].bid == Ticks2[i].bid);
return(Res);
}
voidOnStart()
{
MqlTick TicksOut[];
int Array[];
BENCH(TicksToIntArray_fxsaber1(TicksIn, Array)); // Замерили конвертацию MqlTick[] -> int[].
BENCH(IntArrayToTicks_fxsaber1(Array, TicksOut)); // Замерили конвертацию int[] -> MqlTick[].Print(IsCompare(TicksIn, TicksOut)); // Убедились, что тики на входе и выходе совпадают.
}
// Варианты реализаций/***********************************************/#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280template <typename T1, typename T2>
int ArrayToArray( const T1 &Source[], T2 &Target[] )
{
return(_ArrayCopy(Target, Source) / sizeof(T2));
}
// Перевод массива тиков в массив int[].int TicksToIntArray_fxsaber1( constMqlTick &Ticks[], int &Array[] )
{
return(ArrayToArray(Ticks, Array));
}
// Перевод массива int[] в массив тиков.int IntArrayToTicks_fxsaber1( constint &Array[], MqlTick &Ticks[] )
{
return(ArrayToArray(Array, Ticks));
}
/***********************************************/
ZY De corrida em corrida, eu obtenho resultados muito diferentes. Por exemplo, se eu mudar a ordem dos Testes, tudo quase se inverte. Aparentemente, eu preciso de uma medição de velocidade mais objetiva.
Sem muito pensar e depurar, escrevi a primeira coisa que me veio à mente, então talvez haja muitas falhas. Eu mesmo não encontrei tal tarefa antes (embora tenha trabalhado muito com os sindicatos).
Lembro-me de medir em alguma tarefa local, onde eu tinha que copiar um pequeno número de elementos. Até 16 elementos o para loop era muito mais rápido que o ArrayCopy, quando o número de elementos era maior, o ArrayCopy era mais rápido. É claro, a variante mais rápida sem loops (como minhas funções na página anterior)
Meu ponto é que para(int i=0; i<5; i++) dst[i]=src[i]; funciona mais lentamente que dst[0]=src[0];dst[1]=src[1];dst[2]=src[2];dst[3]=src[3];dst[4]=src[4];
o que é bastante óbvio em vista de operações adicionais relacionadas ao controle de loop)
E CopyArray funciona muito mais rápido do que ambos, como verifiquei agora. Talvez dependa da situação, é claro.
E a CopyArray, como eu verifiquei agora, funciona muito mais rápido do que as duas opções, ao que parece. Talvez dependa da situação, é claro.
Se ArrayCopy() é feito com base no princípio de Cish memmove(),
Eu acho que a velocidade do ArrayCopy() depende da velocidade de alocação de memória, se a memória intermediária do buffer estiver pronta para copiar, o ArrayCopy() será executado muito rapidamente, se a memória não for alocada, você iniciará solicitações ao sistema operacional para alocar memória
você pode tentar testar - fazer uma chamada para o ArrayCopy() com um grande volume de dados, preparando assim a memória buffer para troca, e então fazer um loop com o ArrayCopy() com um volume de dados menor para cópia e com a medição da velocidade
Posso fazer um brainstorming sobre uma rápida implementação da tradução de uma série de estruturas (comprimento múltiplo de tamanho do(int)) de e para uma série int[]?
A aplicação prática é a troca rápida de dados através de recursos. Minha variante é muito universal, por isso é mais lenta.
Estas funções apareceram no MT5
Eles não existem no MT4 e provavelmente não existirão. Portanto, temos que resolver o problema com e sem estas funções (se elas forem úteis).
O resultado será útil para um grande número de usuários do fórum aqui.
Escrevi um modelo muito simples de brainstorming com minha solução para este problema.
Resultado
Resultado
Algo consideravelmente mais rápido do que a segunda opção. Provavelmente não há como acelerar o processo.
umarápida implementação da tradução de um conjunto de estruturas (comprimento múltiplo de tamanho do(int)) de e para um conjunto int[]?
Algo como isto
Algo parecido com isto.
Muito bem feito! Vou entrar no código, obrigado.
Parece que o ArrayCopy é um verdadeiro slowpoke.
ZY De corrida em corrida, eu obtenho resultados muito diferentes. Por exemplo, se eu mudar a ordem dos Testes, tudo quase se inverte. Aparentemente, eu preciso de uma medição de velocidade mais objetiva.
ZZZ, ArrayCopy parece ser um pouco arrasador.
Lembro-me de medir em alguma tarefa local, onde eu tinha que copiar um pequeno número de elementos. Até 16 elementos o para loop era muito mais rápido que o ArrayCopy, quando o número de elementos era maior, o ArrayCopy era mais rápido. É claro, a variante mais rápida sem loops (como minhas funções na página anterior)
A maneira mais rápida é fazê-lo sem nenhum laço (como minhas funções na página anterior).
Eu não entendo.
Eu não entendo.
Meu ponto é que para(int i=0; i<5; i++) dst[i]=src[i]; funciona mais lentamente que dst[0]=src[0];dst[1]=src[1];dst[2]=src[2];dst[3]=src[3];dst[4]=src[4];
o que é bastante óbvio em vista de operações adicionais relacionadas ao controle de loop)
E CopyArray funciona muito mais rápido do que ambos, como verifiquei agora. Talvez dependa da situação, é claro.
Sim, isto funcionará muito mais rápido (substituído, quando possível, pelo ArrayCopy, o resto é o mesmo):
Eu lhe disse, escrevi a primeira coisa que me veio à mente sem testes))
E a CopyArray, como eu verifiquei agora, funciona muito mais rápido do que as duas opções, ao que parece. Talvez dependa da situação, é claro.
Se ArrayCopy() é feito com base no princípio de Cish memmove(),
Eu acho que a velocidade do ArrayCopy() depende da velocidade de alocação de memória, se a memória intermediária do buffer estiver pronta para copiar, o ArrayCopy() será executado muito rapidamente, se a memória não for alocada, você iniciará solicitações ao sistema operacional para alocar memória
você pode tentar testar - fazer uma chamada para o ArrayCopy() com um grande volume de dados, preparando assim a memória buffer para troca, e então fazer um loop com o ArrayCopy() com um volume de dados menor para cópia e com a medição da velocidade