Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么decimal.Parse()比(decimal)double.Parse()慢?_C#_.net_Parsing - Fatal编程技术网

C# 为什么decimal.Parse()比(decimal)double.Parse()慢?

C# 为什么decimal.Parse()比(decimal)double.Parse()慢?,c#,.net,parsing,C#,.net,Parsing,为什么使用double.parse()解析并转换为decimal比调用decimal.parse()更快 鉴于以下情况 string stringNumber = "18.34"; double dResult = 0d; decimal mResult = 0m; for (int i = 0; i < 9999999; i++) { mResult = (decimal)double.Parse(stringNumber); mResult = decimal.Par

为什么使用
double.parse()
解析并转换为
decimal
比调用
decimal.parse()
更快

鉴于以下情况

string stringNumber = "18.34";

double dResult = 0d;
decimal mResult = 0m;
for (int i = 0; i < 9999999; i++)
{
    mResult = (decimal)double.Parse(stringNumber);
    mResult = decimal.Parse(stringNumber);
}
stringNumber=“18.34”;
双结果=0d;
十进制mResult=0m;
对于(int i=0;i<999999;i++)
{
mResult=(十进制)double.Parse(stringNumber);
mResult=decimal.Parse(stringNumber);
}
VS2017事件探查器(.NET framework v4.7)中的以下度量结果;

累计
double.Parse()
和cast占CPU使用量的37.84%,而
decimal.Parse()
占CPU使用量的46.93%。这里存在的差异比数据类型大小的差异更大。有人能解释一下吗


profiler上出现这种情况的应用程序需要10天以上的时间才能运行,因此这一微小差异相当于运行小时数。最好能理解为什么。我可以看到,
decimal.Parse()
调用了
oleaut32.dll
,但是……从源代码开始,
decimal.Parse()
似乎在原地处理精度,而
double.Parse()
经过优化,以尽可能多地处理整数

请注意,
decimal
将精确地表示给定精度的十进制数,其中as
double
并不代表所有十进制值。因此,解析到
double
然后转换到
decimal
可能会得到不同的结果。为什么会更快,因为您处理的是128位数据而不是64位数据。它不再适合单个CPU寄存器,所以我希望它会更慢。此外,字符串的解析算法完全不同,甚至在不同的DLL中,double可能更优化?@DiskJunky
decimal
不是固定精度。它也是浮点,它只是十进制浮点,而不是二进制浮点。因为十进制的使用频率低得多,所以投入的时间也少。十进制是一种特殊类型,主要用于表示货币。计算机需要做的99%的浮点数学不是与钱打交道的,也不需要128位,因此他们花1%的时间优化十进制,而相对而言,花99%的时间优化其他浮点类型。@DiskJunky,好吧,