Ai maladitsa, ti sei pisciato addosso, ti sei corretto, un'altra presa per i fondelli mentre non stiamo bene.
Un anno fa ne soffrivo anch'io, avevo molto entusiasmo. Ostacoli? No, non ne ho visti. Anche se forse sono solo in uno stato d'animo post-vacanze ... :(
Qual è il costo di chiamare le funzioni della libreria rispetto a quello di chiamare le funzioni della classe nativa?
Non si tratta di un semplice wrapper, bisogna chiamare la libreria a ogni starnuto.
Buon per te, ti sei fatto la pipì addosso, ti sei sistemato, un'altra presa per i fondelli mentre noi non ce la passiamo tanto bene.
In realtà, non è così male qui.
È un buon articolo. Uso sempre le libs -- è l'unico modo per separare normalmente il codice.
Dovresti dirmelo tu: quando ci saranno i mega-neuroni universali?
Urain:
Qual è il costo della chiamata delle funzioni di libreria rispetto al costo della chiamata delle funzioni della classe nativa?
Ho controllato, non c'è differenza.
La chiamata della funzione Test empty quando si importa o si include non influisce sul tempo.
/* #import "Graph.ex5" void Test(long achart,string name,int awnd,int ax,int ay,color aclr); #import */ #include "Graph.mq5" void OnStart() { long a=GetTickCount(); for (int i=0; i<1000000; i++) { Test(0, "qwe", 0, 10, 10, clrRed); } Print(string(GetTickCount()-a)); }
In realtà, non è poi così male.
L'articolo è chiaro. Uso sempre le librerie: è l'unico modo per separare correttamente il codice.
Quando ci saranno mega-neuroni universali?
Quando lo saranno i vostri?
Francamente, leggerò ancora un po' i tuoi post e abbandonerò del tutto la MT5.
Sono stufo di tutte queste stampelle fino al midollo, ovunque mi giri è tutto incasinato, "e stanno per far partire il tram" :)
Neuronka è in giro da qualche parte, se si è seriamente con l'umore di sedersi c'è una figata di lavoro rimasto, ma senza umore.
Ho controllato, non c'è differenza.
Una tale chiamata del Test vuoto durante l'importazione o l'inclusione non influisce sul tempo.
Come si dice, senti la differenza:
2012.01.06 16:46:28 Calcolatrice(EURUSD,H1) vuoto=281
2012.01.06 16:46:28 Calcolatrice (EURUSD,H1) lib=2344
//+------------------------------------------------------------------+ //|Test.mq5 | //+------------------------------------------------------------------+ #property library void Test(long achart,string name,int &awnd,int ax,int ay,color aclr) export { awnd=ax+ay; } //+------------------------------------------------------------------+
#import "Test.ex5" void Test(long achart,string name,int &awnd,int ax,int ay,color aclr); #import void OnStart() { int res=0; long a=GetTickCount(); for(int i=0; i<100000000; i++) { Test(0,"qwe",res,10,10,clrRed); } Print("liba=",string(GetTickCount()-a)); a=GetTickCount(); for(int i=0; i<100000000; i++) { res=10+10; } Print("empty=",string(GetTickCount()-a)); }
Come si suol dire, sentite la differenza:
No, stai chiedendo di una chiamata di funzione, vero?
O volevi verificare la velocità di esecuzione di un ciclo?
Ho verificato la differenza tra una semplice chiamata di funzione o una chiamata da ex5 bible. Non c'è alcuna differenza nella velocità delle chiamate di funzione.
È chiaro che un ciclo vuoto senza una chiamata di funzione funzionerà più velocemente. perché verificarlo.
No, stai chiedendo di una chiamata di funzione, vero?
Oppure volevi verificare la velocità di esecuzione del ciclo in generale?
Ho verificato la differenza tra una semplice chiamata di funzione o una chiamata da ex5 bible. Non c'è differenza nella velocità delle chiamate di funzione.
È chiaro che un ciclo vuoto senza una chiamata di funzione funzionerà più velocemente. perché verificarlo.
I loop sono gli stessi, le azioni eseguite all'interno dei loop sono le stesse (in un caso direttamente nel loop nell'altro all'interno della funzione) la differenza di tempo dà il tempo netto della chiamata di funzione dalla lib.
Per la purezza dell'esperimento, descriviamo una funzione simile direttamente nel file:
2012.01.06 17:18:39 Calcolatrice (EURUSD,H1) empty=281
2012.01.06 17:18:38 Calcolatrice (EURUSD,H1) lib=2281
//+------------------------------------------------------------------+ //|Test.mq5 | //+------------------------------------------------------------------+ #property library void Test(long achart,string name,int &awnd,int ax,int ay,color aclr) export { awnd=ax+ay; } //+------------------------------------------------------------------+
#import "Test.ex5" void Test(long achart,string name,int &awnd,int ax,int ay,color aclr); #import void Testlocal(long achart,string name,int &awnd,int ax,int ay,color aclr) { awnd=ax+ay; } void OnStart() { int res=0; int count=100000000; long a=GetTickCount(); for(int i=0; i<count; i++) { Test(0,"qwe",res,10,10,clrRed); } Print("liba=",string(GetTickCount()-a)); a=GetTickCount(); for(int i=0; i<count; i++) { Testlocal(0,"qwe",res,10,10,clrRed); } Print("empty=",string(GetTickCount()-a)); }
Per escludere l'errore, ho anche riscritto la lunghezza del ciclo da un conteggio variabile, il risultato è lo stesso.
Ho 4,5 volte
2012.01.06 17:28:33 test (EURUSD,D1) ex5=2047
2012.01.06 17:28:31 test (EURUSD,D1) local=438
Alex non è sufficiente per te?
4 volte lì, 2 volte lì, ecc.
Se iniziamo a scrivere bibbie basate su bibbie, i freni cresceranno come una palla di neve.
Questo schema può essere utilizzato a condizione che la Bibbia stessa non utilizzi la chiamata Bibbia.
La differenza di velocità dell'esempio precedente è dovuta al fatto che in un caso l'ottimizzatore del codice ha completamente sovrindicizzato una funzione così semplice, escludendo completamente anche la chiamata alla funzione stessa, mentre nell'altro caso è stato costretto a chiamare onestamente una funzione esterna.
Nei test bisogna sempre tenere conto dell'inevitabile influenza dell'ottimizzatore di codice. Questo esempio di loop degenera in res=100; in un compilatore decente nel caso di una funzione locale.
Provate a rendere più grande la funzione chiamata per evitare l'inlining e testatela di nuovo.
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Il nuovo articolo Promuovi i tuoi progetti di sviluppo utilizzando le librerie EX5 è stato pubblicato:
Nascondere i dettagli di implementazione di classi/funzioni in un file .ex5 ti consentirà di condividere i tuoi algoritmi di know-how con altri sviluppatori, impostare progetti comuni e promuoverli nel Web. E mentre il team di MetaQuotes non risparmia alcuno sforzo per realizzare la possibilità di ereditarietà diretta delle classi della libreria ex5, noi lo implementeremo proprio ora.
Ora possiamo includere il file di intestazione e importare la sua implementazione nel nostro Expert Advisor risultante.
Questo può essere schematicamente mostrato come segue:
Autore: ---