Ich versuche, das zu erhalten, was ich Messeinheitensystem nenne, indem ich double in struct umschließe. Ich habe C# -Strukturen wie Meter, Second, Degree usw. Meine ursprüngliche Idee war, dass nach dem Compiler inline alles, was ich hatte, eine Leistung die gleiche wie wenn Double verwendet würde.Verwenden von C# -Typen zum Ausdrücken von Maßeinheiten
Meine expliziten und impliziten Operatoren sind einfach und unkompliziert, und der Compiler führt sie tatsächlich inline, aber der Code mit Meter und Second ist 10 Mal langsamer als der gleiche Code mit Double.
Meine Frage ist: Warum kann C# -Compiler den Code mit Second nicht so optimal machen wie der Code mit Double, wenn er doch alles inline einfügt?
Zweitens wird wie folgt definiert:
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
}
Update:
Ich habe nicht gefragt, ob struct hier passt. Es tut.
Ich habe nicht gefragt, ob der Code inline wird. JIT macht es inline.
Ich überprüfte Assembly-Operationen in der Laufzeit emittiert. Sie waren anders für Code wie folgt:
var x = new double();
for (var i = 0; i < 1000000; i++)
{
x = x + 2;
// Many other simple operator calls here
}
und wie folgt aus:
var x = new Second();
for (var i = 0; i < 1000000; i++)
{
x = x + 2;
// Many other simple operator calls here
}
gab es keine Anruf Anweisungen in der Demontage, so dass Operationen in der Tat inlined wurden. Der Unterschied ist jedoch signifikant. Leistungstests zeigen, dass die Verwendung von Second 10 Mal langsamer ist als die Verwendung von Double.
Also meine Fragen sind (Achtung!): Warum ist JIT generiert IA64-Code ist anders für die oben genannten Fälle? Was kann getan werden, um struct so schnell wie double zu machen? Es scheint keinen theoretischen Unterschied zwischen Doppel und Zweiter zu geben, was ist der tiefe Grund für den Unterschied, den ich gesehen habe?
ist das ein "impliziter" oder "+" Operator? –
Diese Frage könnte Sie interessieren: http://stackoverflow.com/questions/348853/units-of-measure-in-c-altimest – Benjol
Ich weiß, dass Sie C# verwenden, aber haben Sie F # in Betracht gezogen? Es hat statische Einheiten eingebaut, die prüfen, was Sie suchen. Siehe http://stackoverflow.com/questions/40845/how-do-f-units-of-measure-work –