Qual è il modo più veloce per rilevare se un valore double
è un valore finito (né NaN né infinito positivo/negativo) in IL senza generare un'eccezione?Il modo più veloce per rilevare se un doppio è finito?
stavo considerando i seguenti approcci (C# notazione per comodità del lettore solo, nel mio progetto che sto utilizzando IL per questo):
!double.IsNaN(x) && !double.IsInfinity(x)
- il più evidente e, probabilmente, il più lento a causa 2 le chiamate al metodo sono coinvolte.(*(((long*) &x)) & 0x7fffffffffffffffL) < 0x7ff0000000000000L
o in IL:
ldloca x
conv.u
ldind.i8
ldc.i8 0x7fffffffffffffff
and
ldc.i8 0x7ff0000000000000
clt
mie domande circa il secondo approccio sono:
Secondo la mia ricerca, questo dovrebbe determinare con precisione se qualsiasi dato
x
è finito. È vero?È il modo migliore (in termini di prestazioni) per risolvere l'attività in IL oppure esiste una soluzione migliore (più veloce)?
P.S. Apprezzo le raccomandazioni per gestire i miei benchmark e scoprirlo, e lo farò sicuramente. Pensavo che qualcuno avesse già un problema simile e conoscesse la risposta. P.P.S. Sì, mi rendo conto che stiamo parlando nanosecondi abot qui, e sì, sono importanti per il mio caso particolare
put '' (* (((long *) & x)) E 0x7fffffffffffffffL) <0x7ff0000000000000L'' in una funzione '' inline''d e b e felice. –
@BinkanSalaryman sì, potrebbe, ma se l'OP non è l'unico a mantenere il codice, deve scrivere un * molto, molto, molto * buon commento ... –
Sì, davvero. A meno che non sia necessario attenersi semplicemente ai metodi del framework .NET forniti. –