使用C#类型来表达度量单位

使用C#类型来表达度量单位,第1张

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

解决方法 这是我的意见,如果你不同意,请写一个评论,而不是沉默downvoting.

C#编译器不内联它. JIT编译器可能,但这对我们来说是不确定的,因为JITer的行为并不直接.

在双重的情况下,实际上没有调用 *** 作符. *** 作数使用 *** 作码添加在堆栈中.在你的情况下,方法op_Add被调用,加上三个结构复制到堆栈.

要优化它,首先用类替换struct.它将至少最小化副本的数量.

总结

以上是内存溢出为你收集整理的使用C#类型表达度量单位全部内容,希望文章能够帮你解决使用C#类型来表达度量单位所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1237037.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存