我试图通过将double包装到结构中来得到我称之为测量单位系统.我有C#结构,如Meter,Second,Degree等.我原来的想法是,在编译器列入所有内容后,我将具有与使用双倍相同的性能.
我的显式和隐式运算符是简单直接的,编译器实际上是内联它们,而Meter和Second的代码比使用double的代码慢10倍.
我的问题是:为什么C#编译器不能使用第二个代码使用二进制代码,如果它总共嵌入所有的代码呢?
第二个定义如下:
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代码对于上述情况是不同的?可以做什么来使结构体的运行速度达到双倍?看来双双之间没有理论上的差异,我看到的差异的深层原因是什么?