会尝试捕获-导致CPU使用率过高吗?

时间:2019-01-11 09:39:35

标签: c# performance model-view-controller

我正在总结守则。以下代码在foreach循环中几乎重复了4000次。 在我的本地IIS上,它正在运行,但是在Production Cloud Server上,整个应用程序崩溃了。

try
{
    cell.Value = decimal.Parse(dr[dc.ColumnName].ToString());
}
catch
{
    cell.Value = dr[dc.ColumnName];
}

我的查询是:-使用上述Catch块会导致CPU使用率过高吗?

作为补充信息:- Catch达到4000次

1 个答案:

答案 0 :(得分:4)

在代码中出现尝试捕获 的代价是最小的,但IMO可以忽略不计:每'try-that-didnt-t'的 <0.001 µs 捕获”(使用在我的Core i7 x64计算机上构建的.NET 4.6.1版本)。

但是如果必须捕获,那么它的成本确实更高:每次捕获的尝试 12.5 µs (使用在我的Core i7计算机上构建的.NET 4.6.1 Release)。直到达到成千上万的捕获异常的水平,您仍然可能不会注意到。

总而言之,如果可能的话,最好避免抛出和捕捉,并且可以在这里使用decimal.TryParse

您现在必须单独进行null检查,否则.ToString()可能仍会使其崩溃。

重写代码:

var v = dr[dc.ColumnName];
var s = v?.ToString(); // or you might use: var s = v as string;
if (s != null && decimal.TryParse(s, out decimal d))
    cell.Value = d;
else
    cell.Value = v;