Minha abordagem. O núcleo é o motor. - página 87

 
Vasiliy Sokolov:
s.s. Especificamente sobre a questão do armazenamento de cordas em objetos MT, há uma falha estranha. Se você começar a comprimir os dados e usar caracteres não impressos no nome do objeto, em alguns casos você não poderá acessar esse objeto. A falha provavelmente ainda está lá porque é muito específica e não há muita gente que saiba dela, mas mesmo assim você pode tropeçar nela.

Estou vendo. Somente a prática ajudará a descobrir isso definitivamente.

 
Реter Konow:

Caros oponentes.

Aqui está o código do roteiro que:

  1. Mede o tempo de transferência de uma string para uma matriz Char, para passar a string para outro programa através de um recurso e o tempo de recuperação de uma string de uma matriz Char para posterior divisão e recuperação de informações.
  2. Mede o tempo para escrever a string na descrição do objeto MT e o tempo para recuperar a string da descrição do objeto MT, para posterior divisão e recuperação de informações.

Resultado:


Peter, você está testando a coisa errada no lugar errado. O que você está testando deve ter aproximadamente a mesma velocidade em termos de lógica de cordas.

Você entendeu completamente mal minha mensagem.

Minha mensagem era que você deveria parar de usar cordas para passar o dobro, longo, tempo, int, etc. E se você precisar passar um texto, então traduza uma seqüência de texto para a matriz uchar. E todos os dados mistos de diferentes tipos via estruturas de dados sindicais ou arrays destas estruturas, convertidos em arrays uint via union, devem ser passados através de recursos, e no lado receptor, estes arrays uint devem ser convertidos de volta via union para as estruturas originais. Acredite em mim, Peter, as tangas são muito lentas, você deve sempre evitá-las onde possível. O String é necessário apenas para saída de texto e impressão.

E em seu exemplo, você tem a noção de medir o desempenho completamente errada.

Especialmente através da propriedade OBJPROP_TEXT você pode passar um fio com um tamanho máximo de 63 bytes. Isto não é nada.

Embora seu exemplo não faça sentido algum, mas eu o modifiquei para algo mais correto apenas para fins de demonstração e isto é o que eu tenho quando copio 1000 cordas diferentes com tamanho 63 bytes:

O código do roteiro está anexado. Funciona tanto no MT4 como no MT5

MT4:

2018.12.19 00:50:14.542 TestStringVsCharArray NZDUSD,Weekly: время через свойство объекта:      2309 правильность копирования - true
2018.12.19 00:50:14.542 TestStringVsCharArray NZDUSD,Weekly: время через uchar массив:          1882 правильность копирования - true

MT5:

2018.12.19 00:32:30.857 TestStringVsCharArray (NZDUSD,M1)       время через свойство объекта:      32811 правильность копирования - true
2018.12.19 00:33:00.678 TestStringVsCharArray (NZDUSD,M1)       время через uchar массив:          364   правильность копирования - true

Parece que o MT5 é assíncrono, portanto seu método é 100 vezes mais lento e não é nada adequado para o MT5. Você deve se concentrar cada vez mais no MT5

E o que é isso?

StringToCharArray(qwerty,Arr,0,WHOLE_ARRAY);

Você deve ao menos ler a Ajuda

Arquivos anexados:
 
Реter Konow:

Caros oponentes.

Aqui está o código do roteiro que:

  1. Mede o tempo de transferência de uma string para uma matriz Char, para passar a string para outro programa através de um recurso e o tempo de recuperação de uma string de uma matriz Char para posterior divisão e recuperação de informações.
  2. Mede o tempo para escrever a string na descrição do objeto MT e o tempo para recuperar a string da descrição do objeto MT, para posterior divisão e recuperação de informações.

Resultado:


Leia com atenção e conclua: https://docs.mql4.com/ru/basis/types/stringconst
Para ajudar com as conclusões:
1. 2 bytes são alocados para cada caractere da cadeia, codificação Unicode. Não utilização plena da capacidade das cordas.
2. Ao usar a função CharArrayToString (e vice-versa), a conversão de acordo com a codificação dos caracteres na matriz de uchar é realizada, o que também come o tempo da CPU. Use ShortArrayToString(e vice versa).
Tente, mas note que em Unicode o fio deve terminar com zero.
 
Aliaksandr Hryshyn:
Leia com atenção e conclua: https://docs.mql4.com/ru/basis/types/stringconst
Vou ajudar com as conclusões:
1. 2 bytes são alocados para cada caractere da cadeia, codificação Unicode. Não utilização plena da capacidade das cordas.
2. Ao usar a função CharArrayToString (e vice-versa), a conversão de acordo com a codificação dos caracteres na matriz de uchar é realizada, o que também come o tempo da CPU. Use ShortArrayToString(e vice versa).
Tente, mas note que o fio deve terminar com nulo em Unicode.

não concordam. Precisamos de uma matriz de uchar para cordas como um intermediário. E não há conversão, apenas cópia de bytes.

 
Nikolai Semko:

Eu não concordo. Precisamos de uma matriz de uchar para o cordão como intermediário. E não há conversão, apenas cópia de bytes.

Tente passar caracteres cirílicos. E comparando os códigos de caracteres na matriz uchar e na cadeia, a cadeia é passada como uma matriz ushort.
 
Aliaksandr Hryshyn:
Tente usar caracteres cirílicos. E comparar códigos de caracteres em uchar array e em string, string é como ushort array.

Eu sei o que é unicode. Mas, em nosso caso, precisamos apenas de uma matriz de uchar para que a matriz de uchar passe mais adiante através do recurso e ao retomar a cadeia de recuperação de cordas. Não haverá perdas. E, neste caso, não precisamos extrair caracteres da matriz uchar.

A codificação pode ser alterada e, por padrão, não é umunicode.

 
Nikolai Semko:

Peter, você está testando a coisa errada no lugar errado. O que você está testando deve ter aproximadamente a mesma velocidade em termos de lógica de cordas.

Nikolai, com todo respeito, isso são palavras vazias para nada. Eu medi e anexei um roteiro. "O caminho certo, o caminho errado...", "deve ter aproximadamente a mesma velocidade em termos de lógica de cordas"... Apenas palavras.

Nikolai Semko:

...

Você entendeu completamente mal minha mensagem.

Minha mensagem era que você deveria parar de usar cordas para passar o dobro, longo tempo, int, etc. E se você precisar passar um texto, então converta uma seqüência de texto para uchar array. E todos os dados mistos de diferentes tipos via estruturas de dados sindicais ou arrays destas estruturas, convertidos em arrays uint via union, devem ser passados através de recursos, e no lado receptor, estes arrays uint devem ser convertidos de volta via union para as estruturas originais. Acredite em mim, Peter, as tangas são muito lentas, você deve sempre evitá-las onde possível. O String é necessário apenas para saída de texto e impressão.

Essa é exatamente a sua mensagem que eu entendi perfeitamente. E É ERRADO.

Por quê? - Porque você teria que complicar o sistema de trabalhar com parâmetros de controle um LOT. A arquitetura de armazenar, passar e gerenciar parâmetros se tornará TUCH mais complicada e confusa, o que levará a uma série de problemas e a uma desaceleração geral.

Você não entende a arquitetura interna. Você não sabe como os programas interagem, administra os valores dos parâmetros de acordo com seu tipo e propriedades. O que você propõe tornaria as coisas muito mais complicadas e confusas. E não vai resolver o problema de comunicação. Continuará a ser mutilado.

Nikolai Semko:

...

Ainda mais você pode passar um fio com um tamanho máximo de 63 bytes através da propriedade OBJPROP_TEXT. Isso não é nada.

Embora seu exemplo não faça sentido algum, eu o retrabalhei para algo mais correto apenas para fins de demonstração, e aqui está o que consegui ao copiar 1000 cordas diferentes com o tamanho 63 bytes:

...

Você pode passar uma seqüência de 64 caracteres através da descrição de um objeto MT. Isso é suficiente. Eu preciso - 20-30 linhas para transferir dados de tabelas grandes. Sem mesas grandes, eu preciso de 2-3 linhas no máximo.

No momento, estou interessado no MT4.

O MT5 está se desenvolvendo o tempo todo. Os desenvolvedores podem simplesmente adicionar memória comum dos programas de MT (para que não tenham que se preocupar com recursos) e a questão será removida.

 

Nikolai Semko:

...

Minha mensagem era que deveríamos parar de usar cordas para passar o dobro, longo, tempo, int, etc.

...

Como transferir o dobro, longo, tempo, int etc... ???

Mesmo assim, precisamos convertê-lo em cordel e depois em carvão para escrevê-lo no recurso.

Ou você sugere o uso de lparam,dparam ?

Ou seja, sobrecarregar a fila de eventos...

 
Реter Konow:


Que chatice. Estou fora do assunto.
Jardim de Infância, segundo trimestre.
Você me aborrece, Peter, com seu analfabetismo e ignorância e seu arrogante senso de auto-importância e direito.
 
Nikolai Semko:


Além disso, em suas medidas, você esqueceu de adicionar o tempo para economizar e ler o recurso...

Assim, mesmo que você escreva 1000 linhas (que é realmente melhor passar pelo recurso), você não ganha em velocidade, por causa do custo de economizar e recuperar do recurso.

Razão: