【发布时间】:2010-12-02 17:20:49
【问题描述】:
我在查看第三方外包公司提供给我们的一些代码时遇到了这个小宝石:
try
{
int i = strOriginalData.IndexOf("\r\n");
////System.Diagnostics..EventLog.WriteEntry("i", i.ToString());
}
catch (System.Exception ex)
{
////System.Diagnostics..EventLog.WriteEntry("ex", ex.Message);
}
我的问题是编译器会完全优化它吗?当我在 Reflector 中查看编译后的程序集时,它会显示:
try
{
i = this.strOriginalData.IndexOf("\r\n");
}
catch (Exception exception1)
{
ex = exception1;
}
i 的声明已移至方法的顶部,并且 Exception 类型的附加声明也在方法的顶部。
所以,由于这段代码实际上并没有做任何事情,我想知道编译器是否足够聪明,可以看到这段代码什么都不做并且可以优化它。
【问题讨论】:
-
编译器不会对其进行优化,但这类事情可能对性能不利。如果代码本身进入一个异常被抛出然后被吃掉的状态,它将对紧密循环产生剧烈的性能连锁反应。当然是默默地……
-
@chiba:我不认为这是性能问题,更多的是正确性问题。
-
@Henk 我正在考虑以每小时一百万英里的速度循环抛出、捕获然后吞下异常。如果我以前没有多次看到狡猾的“调试”代码这样做,我就不会提及它。
-
@chiba:是的,但这是异常(和)糟糕的代码。我警告说,catch 块通常不利于性能。
-
@Henk 感谢您警告我没有试图传播的神话......不幸的是,我发现上面的代码在新手开发人员中很常见。