我試圖通過將double包裝到struct中來獲得我稱之爲度量單位系統的內容。我有C#結構,如Meter,Second,Degree等。我最初的想法是,在編譯器被內聯後,所有的性能都與使用double相同。使用C#類型來表示度量單位
我的顯式操作符和隱式操作符都很簡單明瞭,編譯器實際上將它們內聯,但Meter和Second的代碼比使用double的代碼慢10倍。
我的問題是:爲什麼C#編譯器不能使用第二代代碼作爲最佳代碼使用double,如果它內聯任何東西?
其次定義如下:
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
}
更新:
如果結構適合在這裏我也沒問。它的確如此。
我沒問過代碼是否內聯。 JIT確實將其內聯。
我檢查了運行時發出的程序集操作。他們的代碼不同的是這樣的:
var x = new double();
for (var i = 0; i < 1000000; i++)
{
x = x + 2;
// Many other simple operator calls here
}
像這樣:
var x = new Second();
for (var i = 0; i < 1000000; i++)
{
x = x + 2;
// Many other simple operator calls here
}
有在拆卸沒有呼叫指令,因此操作實際上是內聯。但差別很大。性能測試表明使用Second比使用double慢10倍。
所以我的問題是(注意!):爲什麼JIT生成IA64代碼是不同的上述情況?可以做些什麼來使結構運行速度提高一倍?似乎沒有理論上的差異,第二,我看到的差異的深層原因是什麼?
是一個'隱式「或」+「運算符? – 2010-11-10 14:04:04
你可能會對這個相關的問題感興趣:http://stackoverflow.com/questions/348853/units-of-measure-in-c-almost – Benjol 2010-11-10 14:09:12
我知道你正在使用C#,但你有沒有考慮過F#?它內置了靜態單元,檢查哪些是你似乎在尋找的東西。請參閱http://stackoverflow.com/questions/40845/how-do-f-units-of-measure-work – 2010-11-10 14:10:41