我有一个我知道会发生但非常罕见的案例。例如,代码每运行一万次,这种情况可能会发生一次。
我可以通过一个简单的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/