Tela vs Etichette

 

Vorrei presentarvi un confronto della velocità di visualizzazione del testo nel grafico, creato con metodi diversi. La prima variante della visualizzazione l'ho fatta usando la classe CCanvas, la seconda l'ho creata sulle etichette (CChartObjectLabel). Tutte le classi sono state prese dalla libreria standard. Questa idea mi è venuta quando ho creato una visualizzazione su CCanvas e ha rallentato significativamente il mio Expert Advisor. Allo stesso tempo, alcuni programmatori hanno sostenuto che mi sbagliavo eCCanvas, e per essere più precisi, OBJ_BITMAP_LABEL è molto veloce, più veloce di tutti i metodi di visualizzazione delle informazioni nel grafico disponibili in MetaTrader.Così, ho deciso di verificarlo sperimentalmente. Quindi, il momento della verità.

Funzionamento del display con uscita inCCanvas

CCanvas

Carico della CPU in questo momento

CPU

Funzionamento del display con uscitaCChartObjectLabel

Etichette

Funzionamento diCChartObjectLabel con CChartObjectLabel con modalità di ottimizzazione della velocità abilitata (ve ne parlerò più avanti).

Etichette ottimizzate

Ora per i valori temporali. Totale è il tempo totale di esecuzione del test Expert Advisor. Min delay,Mid delay eMax delay sonoperiodi di ritardo in tick. Ma non sempre possono essere ottenuti correttamente, nonostante il fatto che ho controllato il codice, non c'erano errori. Penso che abbia a che fare con la funzione GetTickCount64 nel tester. Ma è un problema insignificante. La cosa principale è che mostra il tempo totale.

Ora lasciatemi parlare brevemente dell'ottimizzazione della visualizzazione sulle etichette. Il fatto è che per far apparire il testo sullo schermo è necessario visualizzare le linee di una speciale matrice di linee in etichette, che sono disposte dall'alto in basso nel numero di 50 pezzi. Ma quando si aggiorna solo l'ultima riga, non è necessario aggiornare tutte le etichette, è sufficiente aggiornare solo un'etichetta che corrisponde a questa riga. Attivando la modalità optimizeUpdate si ottiene un guadagno di prestazioni superiore a 2x.

Ho deciso di testare il display sulle etichette in modo più dettagliato, dato che questo periodo di prova è troppo piccolo per esso, a causa della sua velocità. Pertanto, ho aumentato il periodo di prova. E ho ottenuto i seguenti risultati.

SenzaoptimizeUpdate: false

optimizeUpdate: false

ConoptimizeUpdate: true

optimizeUpdate: vero

Ho aggiunto tutti i risultati a Excel

comparizon-of-results

Il primo istogramma mostra il confronto complessivo, il secondo mostra solo la variante con le etichette.

Conclusione: la visualizzazione creata su CChartObjectLabel può essere 83,7 volte più veloce di quella equivalente su CCanvas. Non per niente le operazioni di pixel sono considerate le più costose di tutti i programmi!

Allego una tabella con i risultati dei test. Ilcodice sorgente può essere scaricato da KB:https://www.mql5.com/ru/code/33898


 

Non capisco perché il confronto era nel Visualiser e non nel Terminale?

Non ho esaminato il codice. Per tali compiti Kanvas è fatto uno per tutte le "50 linee".


Nel Terminale, ho misurato attraverso l'Usage-bibble. I metodi non mostrano alcuna differenza significativa.

 
fxsaber:

Non capisco perché il confronto era nel Visualiser e non nel Terminale?

Perché nel Visualiser è la velocità lenta di Canvas che causa i problemi. E potete vedere quali sono. Un tale display consuma più del 50% del tempo della CPU, ne ho parlato sopra! E in Terminal dovreste chiamare i metodi in un ciclo per vedere tutto. Ma non mi sono preoccupato di questo. Ho un Expert Advisor in esecuzione nel ciclo con ottimizzazione offline, dove, infatti, ho bisogno di una tale visualizzazione con aggiornamenti veloci. Ma non sono pronto a presentarlo al momento perché il progetto non è ancora completo.


fxsaber:

Non ho esaminato il codice. Per tali compiti Kanvas è fatto uno per tutte le "50 linee".

Allora date un'occhiata. È l'unico che c'è!

 
Stai ingannando la gente.
Vuoi davvero sbattermelo in faccia, vero?
Sapevo che avresti voluto fare qualcosa del genere. E sapevo che ti saresti inventato qualcosa del genere.

Non sai come preparare i test di confronto.

 
Mihail Matkovskij:

Perché nel Visualiser, è la lentezza di Canvas che causa i problemi. E si può vedere quali. Un tale display consuma più del 50% del tempo della CPU, ne ho parlato sopra! E in Terminal dovreste chiamare i metodi in un ciclo per vedere tutto. Ma non mi sono preoccupato di questo. Ho un Expert Advisor in esecuzione nel ciclo con ottimizzazione offline, dove, infatti, ho bisogno di una tale visualizzazione con aggiornamenti veloci. Ma non sono pronto a presentarlo al momento, perché il progetto non è ancora completo.


Allora dategli un'occhiata. È l'unico che c'è!

Beh... se stai scrivendo solo per un visualizzatore, allora fai questi giochi da solo. Non avete mai sentito parlare di una qualsiasi grafica, anche di segni di apertura/chiusura della posizione che rallentano il renderer? No.

Cercherò di non disturbarti... crea etichette separate per ogni lettera... e anche una risorsa separata...

 
Nikolai Semko:
Stai ingannando la gente.
Vuoi sbattermelo in faccia, vero?
Sapevo che avresti voluto fare qualcosa del genere. Sapevo che avresti voluto fare qualcosa del genere.

Non sai come preparare i test di confronto.

Tutto quello che ho capito dal tuo post sono state le parole "delusione", "LOL", "non so come preparare i test". Davvero, non capisco cosa c'entrino con questo argomento... Il resto non lo capisco dalla parola "affatto"! Quando ho creato questo thread, volevo vedere unacritica costruttiva qui, non un mucchio di affermazioni incomprensibili! Quindi, si preoccupi di spiegare le sue parole. Altrimenti, non scrivere sciocchezze qui!

 
Alexey Viktorov:

Beh... se scrivi solo per il visualizzatore, allora gioca solo a questi giochi. Non avete mai sentito che qualsiasi grafica, anche i segni di apertura/chiusura della posizione rallentano il visualizzatore? No.

Cercherò di non disturbarti... crea etichette separate per ogni lettera... e anche una risorsa separata...

Mi affretto a informarti, Alexei. Tu, naturalmente, tendi a fantasticare, come fa Nikolai... Ma non è proprio come te lo immagini. Semplicemente, sono necessarie soluzioni diverse per compiti diversi. Tu e Nikolai avrete dei commenti sostanziali?!

 
Mihail Matkovskij:

Tutto quello che ho capito dal tuo post sono state le parole "delusione", "LOL", "non so come preparare i test". Davvero, non capisco cosa c'entrino con questo argomento... Il resto non lo capisco dalla parola "affatto"! Quando ho creato questo thread, volevo vedere unacritica costruttiva qui, non un mucchio di affermazioni incomprensibili! Quindi, si preoccupi di spiegare le sue parole. Altrimenti, non scrivere sciocchezze qui!

Pazienza, amico mio, pazienza.
Non ho tanto tempo come te. Sono nel mio ultimo semestre e ho tre progetti di gruppo in parallelo. Quindi sono qui in modalità impulso.
Ma, OK, posso convincerti che sei un illuso, basta che ti rilassi e non ti sforzi troppo, altrimenti i miei sforzi saranno vani.
A meno che, naturalmente, la vostra mente non riesca a sottomettere le vostre emozioni.
 
Nikolai Semko:
Pazienza amico mio, pazienza.
Non ho tanto tempo come te. Sono nel mio ultimo semestre e ho tre progetti di gruppo in parallelo. Quindi sono qui per impulso.
Ma, OK, posso convincerti della tua illusione, basta che ti rilassi e non ti sforzi tanto, altrimenti i miei sforzi saranno vani.

Vai avanti. Solo capirebene il codice prima, perché il codice è una cosa complicata, e ho bisogno di affermazioni chiaramente motivate!

 

Non capisco. La prima immagine ha una tela e c'è del testo sopra.

Le immagini successive non hanno un testo simile sul grafico.

Voglio dire, che cosa veniva paragonato allora?

 
Mihail Matkovskij:

Vai avanti. Ma prima capitebene il codice, perché il codice è una cosa complicata, e ho bisogno di un'affermazione argomentativa chiara!

Non capirò il vostro codice "correttamente". Perché ho già dato un'occhiata. Breve verdetto - guai a chi lo fa di proposito.
Meglio che comprendiate il mio codice, che scriverò nei prossimi due mesi.