Sto cercando di ottenere quello che io chiamo sistema di unità di misura avvolgendo il doppio in struct. Ho strutture C# come Meter, Second, Degree, ecc. La mia idea originale era che dopo che il compilatore fosse in linea, avrei avuto una performance uguale a quella del double.Uso dei tipi C# per esprimere le unità di misura
I miei operatori espliciti e impliciti sono semplici e diretti, e il compilatore li in realtà li allinea, tuttavia il codice con Meter e Second è 10 volte più lento dello stesso codice che usa double.
La mia domanda è: perché il compilatore C# non può rendere il codice usando Second come ottimale come il codice che usa double se allinea tutto comunque?
In secondo luogo è definito come segue:
struct Second
{
double _value; // no more fields.
public static Second operator + (Second left, Second right)
{
return left._value + right._value;
}
public static implicit Second operator (double value)
{
// This seems to be faster than having constructor :)
return new Second { _value = value };
}
// plenty of similar operators
}
Aggiornamento:
Non ho chiesto se struct si inserisce qui. Lo fa.
Non ho chiesto se il codice sarà in linea. JIT lo fa in linea.
Ho controllato le operazioni di assemblaggio emesse in runtime. Erano diversi per il codice come questo:
var x = new double();
for (var i = 0; i < 1000000; i++)
{
x = x + 2;
// Many other simple operator calls here
}
e in questo modo:
var x = new Second();
for (var i = 0; i < 1000000; i++)
{
x = x + 2;
// Many other simple operator calls here
}
Non c'erano istruzioni di chiamata in smontaggio, quindi le operazioni sono state infatti inline. Eppure la differenza è significativa. I test delle prestazioni mostrano che l'utilizzo di Second è 10 volte più lento rispetto all'utilizzo del doppio.
Quindi le mie domande sono (attenzione!): Perché il codice IA64 generato da JIT è diverso per i casi precedenti? Cosa si può fare per rendere la struttura più veloce del doppio? Sembra che non ci siano differenze teoriche tra il doppio e il secondo, qual è la ragione profonda della differenza che ho visto?
è un operatore 'implicito' o' + '? –
Potresti essere interessato a questa domanda correlata: http://stackoverflow.com/questions/348853/units-of-measure-in-c-almost – Benjol
So che stai usando C#, ma hai considerato F #? Ha costruito in unità statiche il controllo che è una specie di ciò che sembra essere alla ricerca. Vedi http://stackoverflow.com/questions/40845/how-do-f-units-of-measure-work –