Cercherò di essere il più chiaro possibile con la mia domanda (non facile ... non è chiaro anche per me). Supponiamo di avere un set di istruzioni IF ... THEN con più operandi, ad esempioVelocità di esecuzione delle istruzioni condizionali rispetto alle funzioni matematiche
IF ((a==0) && (b==1) && (c==1)) THEN x=1
ELSE IF ((a==0) && (b==0) && (c==1)) THEN x=2-
e così via
che potrei sostituire tutti quei FI con una sola funzione matematica come x = a * n1 + b * n2 + c * n3
(questo è solo per darti un'idea, in realtà è più complesso, ma anche gli IF e gli operandi sono molti di più)
La funzione proviene da una rete neurale artificiale precedentemente addestrata.
La mia sensazione istintiva è che quando si tratta di esecuzione, la funzione dovrebbe richiedere molto meno tempo dei FI, ma è solo una sensazione istintiva che deriva dal mio vecchio background in assemblea dove ci hanno insegnato che un'istruzione condizionale prende piede più tempo di uno aritmetico.
Puoi confermare questo? magari fornirmi anche qualche link dove potrei trovare una spiegazione?
Grazie in anticipo ragazzi!
Credo che il tuo istinto è giusto. Ho seguito alcune domande di ottimizzazione qui su SO su risultati sorprendenti dall'eliminazione di filiali. –
https://en.wikipedia.org/wiki/Branch_predictor e gli articoli a cui rimanda forniranno un inizio. I guadagni relativi dipendono dalla complessità della funzione e dai possibili rami ma, con i processori moderni, i predittori di pipeline e diramazioni sono spesso rilevanti. – Peter
Forse dovresti controllare prima che il tuo compilatore [non possa già farlo] (http://stackoverflow.com/questions/26124620/why-does-msvc-emit-a-useless-movsx-before-performing-this-bit -test) prima di fubar il tuo programma. E naturalmente * sempre * verifica prima che sia effettivamente * possibile * fare la differenza, utilizzare un profiler. Il motto del programmatore è di misurare tre volte, tagliare una volta. –