Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Puoi mandarmi il link per favore?
Non l'ha tenuto. Menzionato sul forum qui. Ho cercato io stesso nei motori di ricerca.
Non l'ha tenuto. Menzionato sul forum qui. Ho cercato io stesso nei motori di ricerca.
Ovviamente, tutte queste moto sono state ricostruite molte volte. Sono stati pubblicati persino dei libri, fino alle implementazioni asm.
Al giorno d'oggi le basi sono difficili da trovare, dato che quasi tutti usano API rilevanti per tutte le occasioni.
Quindi devi solo registrarti sui forum e chiedere in giro.
Ovviamente, tutte queste moto sono state ricostruite molte volte. Sono stati pubblicati persino dei libri, fino alle implementazioni asm.
Ora le basi sono difficili da trovare, dato che quasi tutti usano API rilevanti per tutte le occasioni.
Quindi devi solo registrarti sui forum e chiedere.
Perché non usate LONG_MAX/MIN? Sarebbe più bello in qualche modo. Ha un bell'aspetto, credo. Ho fatto i tuoi test con gcc (con minime modifiche, naturalmente, il compilatore è molto vecchio 5.4.0, quello che avevo a portata di mano):
Beh, sì, non è bello. MaLONG_MAX= 9223372036854775807 è più di 9007199254740992. E la forma esadecimale di questo numero - 0x20000000000000 è rimproverata perché deve essere solo per il tipo ulong. Non so nemmeno come renderlo più chiaro. Non posso scrivere (ulong)(1<<53) perché è un'operazione che richiede tempo.
Il tipo double inizia a contenere interi senza parti frazionarie non a partire dal valoreLONG_MAX ma dalla massima mantissa possibile. Ma 53 bit sono permessi per la mantissa, cioè 2^53=9007199254740992.
La tempistica del tuo codice fallisce - l'output è in milisecondi (non nano), e ancora non capisco perché abbiamo bisogno di meno t0.
t0 è il tempo di un ciclo completo di 1000000 passaggi della somma dei doppi primi
mentre t è il tempo dello stesso ciclo di somma degli stessi valori doppi, ma passati attraverso le funzioni ceil, ceil, round ecc.
Ho proceduto dalla logica che la differenza (t-t0) è il tempo netto speso per queste funzioni.
Naturalmente, una maggiore obiettività può essere raggiunta solo facendo diverse misurazioni.
- In nano calcolo sulla base del tempo impiegato per eseguire una funzione su 1.000.000. Esattamente in nano è corretto.
pavlick_:
Ho eseguito i tuoi test su gcc (con minime modifiche, naturalmente, il compilatore è molto vecchio 5.4.0, quello che era a portata di mano):
1. Compilazione con -O3.
2. Compilazione con -Ofast
Non scrivere (ulong)(1<<53), poiché questa è già un'operazione che richiede tempo.
Questa operazione non richiede tempo, come tutte le operazioni con le costanti, comprese le stringhe.
Questa operazione è senza tempo come tutte le costanti, comprese le stringhe.
Wow - forte! Grazie. E ho pensato che conta ogni volta. Sì, beh, è logico, puoi già calcolarlo a tempo di compilazione.
Bene, questo è tutto allora:
Tuttavia, sarebbe più corretto scrivereDBL_MANT_DIG invece di 53
Caso di guadagno minimo se tutti i valori del doppio sono frazionari.
Così si scopre. Che il codice MQL5 compilato funziona più velocemente persino di Ofast? Trovo difficile credere che tu debba avere un compilatore a 32 bit.
Ho tolto il meno t0 da tutto (pensavo fosse un qualche tipo di errore) e il mio output ha tutto il ciclo misurato, non un singolo passaggio. Se convertiamo nella vostra forma di uscita in nanosecondi per iterazione (nella prima riga "Tempo di ciclo senza arrotondamento" - abbiamo lo stesso modo di contare), otteniamo:
Non c'è molta accelerazione su gcc (e ancora più lenta su -Ofast). Su mcc c'è un'accelerazione significativa a giudicare dal tuo test, ma:
avete 985'651 su 1'000'000 cioè quasi tutte le iterazioni soddisfano la condizione x < MIN || x > MAX.
-Ofast disabilita tutti i controlli inf/nan, l'impostazione di errno, cioè l'arrotondamento nudo sulla fpu è lasciato. E questo arrotondamento nudo non può essere sconfitto da un semplice confronto di x < MIN || x > MAX.
Non c'è molta accelerazione su gcc (e ancora più lenta su -Ofast). Su µl è significativo.
Tuttavia, è difficile dirlo. Abbiamo buttato fuori t0 per delle belle cifre e abbiamo ottenuto 20 volte la differenza. Anche un minimo codice aggiuntivo sotto forma di ciclo (+t0) rende il risultato bello in diverse decine di volte a meno attraente in circa due volte. E cosa si può dire se non è solo un loop ma un vero algoritmo che fa qualcosa di utile? La differenza non sarà affatto visibile, vagherà da qualche parte molto dopo la virgola e difficilmente diventerà un collo di bottiglia. In un'applicazione reale il prelievo di mutex, le barriere della cpu, l'allocazione della memoria sono molto più costosi dell'arrotondamento. Tutto sommato, non ne vale la pena, imho.
Sì, la differenza non sarà affatto visibile, sarà appesa da qualche parte molto dopo la virgola ed è improbabile che sia un collo di bottiglia. In un'applicazione reale prendere mutex, barriere di cpu, allocazione di memoria sono molto più costosi dell'arrotondamento. Tutto sommato, non ne vale la pena, imho.
Questo è vero il 99% delle volte, sì.
Prima di ottimizzare, bisogna assicurarsi di avere qualcosa da ottimizzare.
Nella mia pratica ricordo solo un caso in cui la mia implementazione di atof è stata davvero utile. Anche se mi sembrava che fosse così.
E si dovrebbe tenere a mente che qualsiasi ottimizzazione (tranne ***) non è gratuita.