我不想讨论何时抛出异常而不抛出异常.我想解决一个简单的问题.99%的时间不抛出异常的论点围绕着它们缓慢而另一方声称(基准测试)速度不是问题.我读过很多关于一方或另一方的博客,文章和帖子.那是哪个呢?
我听说过你应该避免尝试使用catch块的建议,因为它们很贵.
我的问题是关于.NET平台:为什么尝试块很昂贵?
回复摘要:
在这个问题上显然有两个阵营:那些说试试块是昂贵的,那些说"可能只是一点点".
那些说try块很贵的人通常会提到解除调用堆栈的"高成本".就个人而言,我不相信该辩解-阅读有关的异常处理程序如何存储后,专门在这里.
Jon Skeet坐在"可能只是一点点"的阵营中,写了两篇关于异常和性能的文章,你可以在这里找到.
有一篇文章我觉得非常有趣:它谈到了try块的"其他"性能影响(不一定是内存或cpu消耗).Peter Ritchie提到他发现try块中的代码没有被优化,因为它本来是编译器的.你可以在这里阅读他的发现.
最后,有一篇博客文章介绍了在CLR中实现异常的人的问题.在这里看一下Chris Brumme的文章.
有没有更快的方法来简单地捕获如下的异常?
try
{
date = new DateTime(model_.Date.Year, model_.Date.Month, (7 * multiplier) + (7 - dow) + 2);
}
catch (Exception)
{
// This is an invalid date
}
Run Code Online (Sandbox Code Playgroud) 我在C#(.NET 2.0)中有一个大项目,它包含由SubSonic生成的非常大的代码块.像这样的尝试捕获导致可怕的性能打击?
for (int x = 0; x < identifiers.Count; x++)
{decimal target = 0;
try
{
target = Convert.ToDecimal(assets[x + identifiers.Count * 2]); // target %
}
catch { targetEmpty = true; }}
Run Code Online (Sandbox Code Playgroud)
发生的事情是,如果传入的给定字段不是可以转换为十进制的字段,则会设置一个标志,然后在记录中进一步使用该标志以确定其他内容.
问题是,当我通过30k记录进行解析时,应用程序实际上会抛出数以万计的异常.整个过程花了将近10分钟的时间来完成所有事情,我的总体任务是将时间改进一些,如果这是一个糟糕的设计理念,这似乎很容易挂起.
任何想法都会有所帮助(善良,这是一个悲惨的一天)
谢谢,克里斯