Errori, bug, domande - pagina 2162

 
Artyom Trishkin:
Enum è un'enumerazione di interi.
0,1,2,3..., ecc.

Se un modello di funzione contiene

EnumToString();

si verificano problemi...

 
Vladimir Pastushak:

Se il modello di funzione contiene

EnumToString();

I problemi sorgono...

Un esempio è necessario.
 
Artyom Trishkin:
Un esempio è necessario.

Ho fatto un sovraccarico, uno dei quali era un modello...

per poter separare le mosche dalle cotolette...

 
Vladimir Pastushak:

Ho fatto un sovraccarico, uno dei quali era un modello...

per poter separare le mosche dalle cotolette...

Conosco le mosche, ho visto le cotolette, ma non riesco a vedere il problema senza il codice della funzione.
 
Renat Fatkhullin:

Ottimizzare la matematica: provare a usare gli array invece di sqrt.

Quindi prendere un elemento per indice da un semplice array dovrebbe essere un'operazione molto veloce, no?

 
Комбинатор:

quindi prendere un elemento per indice da un semplice array dovrebbe essere un'operazione molto veloce, no?

Dove vedi un semplice array?

È un array dinamico di un linguaggio gestito con tutte le implicazioni di controllo. E sqrt è una singola istruzione nativa della CPU.


Benvenuti nel mondo delle sorprendenti scoperte di ottimizzazioni e dell'influenza di una massa di fattori in ogni caso in ogni generazione di CPU, ogni differenza di dimensioni della cache, multitasking, penalità, ecc.

Solo 20 anni fa armeggiavo con il codice assembler su un processore 486, lottando con velocità che variavano di decine di percento a causa della riorganizzazione delle istruzioni, dell'allineamento e del semplice posizionamento della memoria. Sembrava assurdo, ma i manuali Intel e Vtune hanno poi spiegato il quadro.

Ma oggi la situazione con i risultati dell'ottimizzazione è sfuggita di mano molto tempo fa. Ci sono così tanti processori diversi con diverse cache sul mercato che il vostro codice è garantito per essere eseguito a velocità diverse. Le cache dei processori e l'architettura del processore hanno un impatto enorme. Anche il controllo dinamico della frequenza della CPU deve essere disattivato per rimuovere decine di percentuali di differenza su un benchmark.

Per esempio: gli atomi con cache miss apparentemente su architetture decenti o modelli U strangolati mostrano spesso risultati più volte inferiori anche su casi semplici. Più cache miss e addio.

 
Artyom Trishkin:
Conosco le mosche, ho visto le cotolette, ma il problema non è visibile senza il codice della funzione.
Se una funzione sovraccaricata ha una stringa, c'è un problema quando la si chiama per un intero...
 
Renat Fatkhullin:

Dove vedi una semplice matrice?

Non è il caso di impostare la complessità. Gli array sono usati ovunque, negli indicatori sono la parte principale di calcolo, e ora state quasi direttamente ammettendo che la vostra implementazione degli array è lenta.

Credo che siate molto più bravi nelle ottimizzazioni, ma dal punto di vista di un utente comune sembra strano - dichiarate che il compilatore MQL genera codice paragonabile al C++, ma improvvisamente si scopre che gli array in MQL non sono affatto veloci.
 
Комбинатор:

Non è il caso giusto per impostare la complessità. Gli array sono usati ovunque, negli indicatori sono la parte principale di calcolo, e ora state quasi direttamente ammettendo che la vostra implementazione degli array è lenta.

Rispetto a un singolo comando diretto dell'assemblatore?

Sì, è così. Quello che non sapete è che i processori hanno da tempo tabelle precalcolate di varie funzioni matematiche incorporate. E i costosi comandi matematici della cpu li usano per accelerare le cose.

Lunedì faremo un'analisi dettagliata del suo esempio e scopriremo la causa esatta.
 
Renat Fatkhullin:

Rispetto a un singolo comando diretto dell'assemblatore?

l'indice dell'array si riduce nel migliore dei casi anche a un singolo comando diretto dell'assemblatore, quindi la domanda rimane