2013-08-05 128 views
-1

我在这里有一个选择。两个意见:ASP.NET性能:哪个更快?

一个是读取一个长约两页的XML文件,并试图找出是否可以找到某个属性值并将其分配给一个字符串。第一次是找出属性是否存在,而不是空。第二次读取和分配值。

If([xmlAttribute]!= null){ 
    string = xmlAttribute; 
} 

两个只是读取一次相同的XML文件,并尝试直接分配值,而不尝试先找到它。如果失败,它会抛出一个异常,并且catch块会将该字符串赋值为null。

try{ 
    string = [xmlAttribute]; 
}catch(Exception ex){ 
    string = null; 
} 

哪种方式更快?或者有更好的主意? 谢谢。

+1

你的基准测试结果显示了什么? –

+0

你为什么不试试并找出答案? – tnw

+0

我不认为这是合法的C#。你不能为一个字符串赋值。 – recursive

回答

4

创建异常有很多开销 - 有关方法,堆栈跟踪和基础错误的详细信息非常耗时收集。使用例外作为预期的程序逻辑的一部分是编码差。

寻找一种方法来检查数据,而不会在任何可能的情况下抛出异常。

+1

例外情况仅适用于特殊情况。 – Romoku

+1

同意。而且我会补充一点,即使Exception方法在有限的测试中运行得更快,它也不会像任何使用非异常逻辑执行操作的代码那样进行扩展。 –

+0

优秀的答案。作为回答之前,我在这些帖子上发布了一些答案,但选择答案的人(使用异常投掷!)认为否则(我敢肯定,他投下了我)。 http://stackoverflow.com/a/17886280/1132959无论如何,伟大的答案,我同意。 – user1132959

0

一次读两次会更快。

虽然这并不一定意味着更好。

+1

这取决于抛出异常的频率,如果在抛出异常时读取一次需要的时间再多1000倍,那么千万不要抛出异常超过1​​次,因为它是值得的。 –

+0

没错,但问题是“如果”发生异常,每次都不会发生异常。尽管如此,我并不反对异常成本很高。 –

0

假设你正在使用LINQ to XML:

var element = xml.Element("Name"); 
var attribute = element == null ? null : element.Attribute("first"); 
var value = attribute == null ? null : attribute.Value; 

我通常会添加一些扩展方法来缓解这个过程中,例如:

var value = xml.Element("Name").OptionalAttribute("first").ValueOrDefault(); 

文件的命名将扩展方法是由你。