【问题标题】:ASP.NET performance: which is faster?ASP.NET 性能:哪个更快?
【发布时间】:2013-08-05 17:44:03
【问题描述】:

我在这里有一个选择。两种意见:

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

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

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

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

哪种方式更快?还是有更好的主意? 谢谢。

【问题讨论】:

  • 您的基准测试结果显示了什么?
  • 你为什么不试试看看呢?
  • 我不认为这是合法的 c#。您不能将一个分配给string

标签: c# asp.net xml exception


【解决方案1】:

创建异常需要大量开销——收集有关方法、堆栈跟踪和底层错误的详细信息非常耗时。使用异常作为预期程序逻辑的一部分是糟糕的编码。

尽可能寻找一种检查数据而不抛出异常的方法。

【讨论】:

  • 例外是为特殊情况保留的。
  • 同意。我还要补充一点,即使 Exception 方法在有限的测试中运行得更快,它也不会像任何使用非异常逻辑来执行操作的代码那样扩展。
  • 优秀的答案。我之前按照这些思路发布了一些内容作为答案,但是选择答案的人(使用异常抛出!)不这样认为(我很确定他投了我的票)。 stackoverflow.com/a/17886280/1132959 无论如何,答案很好,我同意。
【解决方案2】:

阅读一次而不是两次会更快。

但这并不一定意味着更好。

【讨论】:

  • 这取决于抛出异常的频率,如果在抛出异常时读取一次需要 1000 倍的时间,那么您在 1000 次中抛出异常的次数不得超过 1 次才值得。
  • 对,但问题指出“如果”发生异常,并不是每次都发生异常。不过,我不同意例外的成本很高。
【解决方案3】:

假设您使用的是 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();

如何命名扩展方法取决于您。

【讨论】:

    猜你喜欢
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2012-08-31
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    相关资源
    最近更新 更多