Domande su MQL4 - pagina 12

 
l'unica domanda è: будет ли работать заметно быстрее, если обработку массивов вынести в DLL?
qualcuno ha qualche compilatore installato? per favore controllate! è così noioso?


Gli accessi alle matrici sono dieci volte più lenti delle variabili locali.


Il tempo di indirizzamento di un elemento dell'array non è SEMPRE più lungo del tempo di indirizzamento di una variabile.
Le cifre specifiche saranno diverse per i diversi compilatori, ma la tendenza dovrebbe rimanere la stessa.

Il compilatore è Visual Studio 2005. Il processore è Athlon XP 2500+.
Il tempo di esecuzione insieme all'inizializzazione dell'array è di 1,06-1,07 sec.
Dim t1, t2 As Double t1 = DateAndTime.Timer() Dim x, y, z As Double Dim d, k As Double Dim Open(5001), Close(5001) As Double For d = 5000 To 1 Step -1 For k = 1 To 4999 z = Close(k) : y = Close(k + 1) : x = Close(k + 2) z = Open(k) : y = Open(k + 1) : x = Open(k + 2) Next Next t2 = DateAndTime.Timer() MsgBox(CStr(t2 - t1) + " secondi")



Lo stesso ciclo, ma con

z = Close(1) : y = Close(1) : x = Close(1) z = Open(1) : y = Open(1) : x = Open(1)


dà da 0,37 a 0,4 secondi.

E infine,

z = k : y = k : x = k z = k : y = k : x = k


0,56-0,6 с.

Quindi vorrei trarre la seguente conclusione:
non riguarda un compilatore e non riguarda "array/non-array", ma la corretta strutturazione dei dati e il codice corretto!
P.S. Naturalmente, tutte le tesi di cui sopra, ad eccezione delle misure di tempo, sono la mia opinione personale, profondamente soggettiva e modesta, solo come programmatore.

 
grazie!

sì, l'ottimizzazione del codice risultante nel compilatore è una potenza dopo tutto...
Non voglio entrare nei dettagli, ma sembra che visual studio copiler ottimizzi gli accessi agli array da solo.
per rendere il test equo, è necessario inserire una variabile, diciamo, S; e inserire tra tutte le assegnazioni x,y,z qualcosa come S=S+x, S=S+y, S=S+z, e poi emettere S oltre al tempo per ottenere la velocità "pura".

anche se l'ottimizzatore del compilatore può parzialmente capire questo imbroglio... :)
 
per garantire l'integrità del test, dobbiamo introdurre una variabile


Ho abbandonato da tempo questi pensieri. Ho anche fatto dei test. E sono giunto a una conclusione:

Il compilatore esegue tutte le operazioni prescritte e semplicemente non ha il diritto di non eseguirle perché è semplicemente impossibile sapere al 100% da dove ho intenzione di accedere a queste variabili - nello stesso metodo, da qualche timer (e codice strutturalmente non collegato) o anche da qualche altro processo.
Quindi, tutto è giusto. Controllato.

P.S. Offtopics, scusate. Non ho potuto resistere.
 
sugli accessi agli array...
qual è l'array specificato dal parametro in ArrayCopySeries?

è un normale array di valori o un array di puntatori a valori?

(questa è ovviamente una domanda stupida, ma non programmo da 10 anni, tanto meno in C, tanto meno su Windows.)

e dove leggere tutto questo?
 
C'è un modo per determinare lo stato del trigger EA tra i tick?
Ho davvero bisogno...

C'è un modo per... Non lo so. È consentita l'invocazione ricorsiva di start()?
 
quindi la deinit() non viene attivata quando il pulsante viene spento?
 
C'è un modo per determinare lo stato del pulsante di abilitazione dell'EA tra i tick? <br / translate="no">

Non c'è modo. l'EA non partirà se il pulsante è disabilitato.

È permesso l'accesso ricorsivo a start()?

è permesso.
 
Slawa,
Grazie per la tua risposta.


Beh, uh... E ora che si fa...?
Non so... o andare per 5, ma ieri... e oggi per 3... quelli piccoli.

Dovrò accontentarmi di tanti piccoli. Non volevo. Beh, e adesso... :(
Sembra così facile...

(non fate caso a me, c'è già la meditazione che schizza sulla tastiera)
 
FirstVisibleBar() e BarsPerWindow() non sono evidenziati a colori in ME.
Sono solo io, o dovrebbe essere così?
 
FirstVisibleBar() e BarsPerWindow() non sono evidenziati a colori in ME. <br / translate="no"> Sono solo io o dovrebbe essere?

Sono e sono sempre stati evidenziati normalmente. Ho appena controllato la build 183 e la 187.
Motivazione: