【发布时间】:2012-01-17 11:31:11
【问题描述】:
有没有比Convert.ToDouble 将string 转换为double 的更快 方法?
我已经监控了System.Convert.ToDouble(string) 的调用,它会降低我的应用性能。
Convert.ToDouble("1.34515");
来自 Jeffrey Sax 的工作答案:
static decimal[] decimalPowersOf10 = { 1m, 10m, 100m, 1000m, 10000m, 100000m, 1000000m };
static decimal CustomParseDecimal(string input) {
long n = 0;
int decimalPosition = input.Length;
for (int k = 0; k < input.Length; k++) {
char c = input[k];
if (c == '.')
decimalPosition = k + 1;
else
n = (n * 10) + (int)(c - '0');
}
return n / decimalPowersOf10[input.Length - decimalPosition];
}
【问题讨论】:
-
嗯,显而易见的事情是避免首先需要转换(例如,首先将数据保持为双精度)。话虽如此,我也担心某些东西正在处理“价格”,但使用双精度数(即此类数字应首选十进制)
-
转换有时会失败并抛出异常吗?异常是昂贵的(但你仍然可以每秒抛出几千个)。您多久拨打一次
ToDouble?对ToDouble的 2 次调用不可能花费 5 毫秒。你能给我们代码吗?为了衡量性能,经常执行它并计算平均值。 -
我同意@Damien 的观点,货币值应该存储在
decimal中,而不是双倍,但这不会提高性能。 -
一项快速测试表明,我的 comp 在单核上每秒可以进行大约 500 万次双精度解析。那么你解析了多少数据才能成为一个问题呢?
-
请发布相关的代码子集。总时间的 50% 也是相关的。如果您的代码没有做任何昂贵的事情,那么 50% 也不算多。
标签: c# performance