c# - 对于已知情况是否应该避免 try catch

标签 c# performance if-statement try-catch

我有一个我知道会发生但非常罕见的案例。例如,代码每运行一万次,这种情况可能会发生一次。

我可以通过一个简单的if来检查这种情况,但是这个if会运行很多次但没有用。

另一方面,我可以将代码放在 try-catch block 中,当发生特殊情况时,我会执行恢复所需的操作。

问题是哪个更好?我知道,一般来说,由于开销问题,try-catch 不应该用于已知情况,而且应用程序逻辑不应该依赖于 catch 代码,但多次运行 if 会产生更多性能问题。我已经使用这个小测试代码对此进行了测试:

static void Main(string[] args)
{
    Stopwatch sc = new Stopwatch();
    var list = new List<int>();
    var rnd = new Random();
    for (int i = 0; i < 100000000; i++)
    {
        list.Add(rnd.Next());
    }

    sc.Start();
    DoWithIf(list);
    sc.Stop();
    Console.WriteLine($"Done with IFs in {sc.ElapsedMilliseconds} milliseconds");
    sc.Restart();
    DoWithTryCatch(list);
    sc.Stop();
    Console.WriteLine($"Done with TRY-CATCH in {sc.ElapsedMilliseconds} milliseconds");
    Console.ReadKey();
}

private static int[] DoWithTryCatch(List<int> list)
{
    var res = new int[list.Count ];
    try
    {
        for (int i = 0; i < list.Count; i++)
        {
            res[i] = list[i];
        }
        return res;
    }
    catch
    {
        return res;
    }
}

private static int[] DoWithIf(List<int> list)
{
    var res = new int[list.Count - 1];
    for (int i = 0; i < list.Count; i++)
    {
        if (i < res.Length)
            res[i] = list[i];
    }
    return res;
}

这段代码只是将大量数字复制到一个大小不够的数组中。在我的机器中,每次检查数组边界大约需要210毫秒运行,而使用try-catch,一旦运行大约190毫秒就会命中catch。

此外,如果您认为这取决于具体情况,我的情况是,我在应用程序中收到推送通知,并会检查我是否有消息的主题。如果没有,我将获取并存储下一条消息的主题信息。几个主题中有很多消息。

最佳答案

因此,准确地说,在您的测试中,对于一个循环,if 选项比 try...catch 选项慢 20 毫秒100000000 次。
这相当于 20/100,000,000 - 即每次迭代0.0000002 毫秒

您真的认为这种纳米优化值得编写违反正确设计标准的代码吗?

异常是指特殊情况,即您无法控制或无法提前测试的事情 - 例如,当您从数据库读取数据并且连接在中间终止时 - 类似这样的事情。 对可以通过简单代码轻松测试的事物使用异常 - 嗯,这完全是错误的。

例如,如果您已经证明这两个选项之间存在有意义的性能差异,那么也许您可以证明使用 try...catch 而不是 if - 但是显然这里的情况并非如此。

所以,总结一下 - 使用 if,而不是 try...catch

您应该为了清晰而设计代码,而不是为了性能。
编写代码,以尽可能清晰的方式传达其正在实现的算法。
设置性能目标并根据这些目标衡量代码的性能。
如果您的代码未达到您的性能目标,请找到瓶颈并加以解决。
设计代码时,不要在纳米优化上浪费时间。

关于c# - 对于已知情况是否应该避免 try catch ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47451566/

相关文章:

c# - 在 FileHelpers 映射类中使用数组

php - 过多使用 session 是否会降低 PHP 的性能?

mysql - MariaDB 关于连接的连接的查询非常慢

MYSQL 查询优化 : build seperate tables with ORDER BY done so don't need indexes for SELECT ORDER BY

C# Linq to MySQL query with join 会产生错误的 SQL?

C# - 当用于添加项目的临时值发生变化时,列表中的项目也会发生变化

c# - 防止.net ide在中断时跳转到当前执行行

python - 根据另一个 df 中的值填充新的 pandas df

php - 停止为PHP提供错误number_format

javascript - 如何使用数组和 && 条件构建长 If 条件?