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

4

为什么使用 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);
}

在VS2017分析器(.NET框架v4.7)中,以下度量结果如下: Performance metrics 累计的double.Parse()和强制转换占用了37.84%的CPU使用率,而decimal.Parse()占用了46.93%的CPU。这里的差异不仅仅是数据类型大小的差异所能解释的。有人能解释一下吗?
在分析器中出现这种情况的应用程序需要运行10多天,因此这种小差异相当于数小时的运行时间。理解原因很重要。我可以看到decimal.Parse()调用了oleaut32.dll,但是......是怎么回事?

5
请注意,decimal 类型可以精确表示给定精度的十进制数,而 double 则不能。因此,先将数据解析为 double 类型再转换为 decimal 可能会得到不同的结果。 - juharr
8
为什么速度会更快,因为你要处理的是128位数据而不是64位数据。它不再适合单个CPU寄存器,所以我希望它会变慢。另外,字符串解析算法完全不同,甚至在不同的dll中,也许双精度浮点数更加优化? - Scott Chamberlain
2
@DiskJunky,“decimal”不是固定精度。它也是浮点数,只是十进制浮点数而不是二进制浮点数。 - user743382
1
因为十进制数很少使用,所以人们投入的时间也相对较少。十进制数是一种非常独特的类型,通常只用于表示货币。计算机需要进行的99%浮点数运算与货币无关,也不需要128位,因此他们只花费1%的时间来优化十进制数,而把99%的时间都用在了优化其他浮点类型上。 - Scott Chamberlain
2
@DiskJunky,好的... doubles' 实现decimal's 实现 - Scott Chamberlain
显示剩余11条评论
1个回答

6
double 实现decimal 实现 来看,decimal.Parse() 在原地处理精度,而 double.Parse() 被优化为尽可能多地使用整数进行计算。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接