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

Anu*_*nup 3 c# model-view-controller performance

我正在总结该守则。以下代码在foreach循环中迭代了近 4000 次。在我的本地 IIS 上,它可以正常工作,但在生产云服务器上,整个应用程序崩溃了。

try
{
    cell.Value = decimal.Parse(dr[dc.ColumnName].ToString());
}
catch
{
    cell.Value = dr[dc.ColumnName];
}
Run Code Online (Sandbox Code Playgroud)

我的疑问是:- 如上所述使用 Catch 块会导致 CPU 使用率高吗?

作为附加信息:- Catch已点击 4000 次

Pet*_*r B 6

在代码中使用 try-catch 的性能成本很小,但在 IMO 中可以忽略不计:每个“try-that-didnt-catch”的性能成本在< 0.001 \xc2\xb5s范围内(使用 .NET 4.6.1 Release 版本)在我的 Core i7 x64 机器上)。

\n\n

如果它必须 catch ,那么它的成本确实要高得多:每个“try-that-had-to-catch”在12.5 \xc2\xb5s范围内(使用 .NET 4.6.1 Release 构建)我的酷睿 i7 机器)。不过,您可能不会注意到,直到您达到数十个数千个捕获异常的水平。

\n\n

总而言之,如果可以的话,最好避免抛出和捕获,并且您可以在此处使用decimal.TryParse来做到这一点。

\n\n

您现在必须单独进行空检查,否则.ToString()仍可能导致崩溃。

\n\n

重写的代码:

\n\n
var v = dr[dc.ColumnName];\nvar s = v?.ToString(); // or you might use: var s = v as string;\nif (s != null && decimal.TryParse(s, out decimal d))\n    cell.Value = d;\nelse\n    cell.Value = v;\n
Run Code Online (Sandbox Code Playgroud)\n