【问题标题】:How much do conditionals affect performance?条件对性能有多大影响?
【发布时间】:2013-11-04 18:14:26
【问题描述】:

条件对性能有多大影响?例如,代码 A 是否会比代码 B 执行得更快,因为它只检查布尔值一次? (data 在本例中是 DataTable

代码 A:

bool isBusiness = string.IsNullOrEmpty(data["businessName") ? false : true;
if(isBusiness) {
    var name = data["businessName"];
    var id = data["businessId"];
    var phone = data["businessPhone"];
    var address = data["businessAddress"];
}
else {
    var name = data["customerName"];
    var id = data["customerId"];
    var phone = data["customerPhone"];
    var address = data["customerAddress"];
}

代码 B:

bool isBusiness = string.IsNullOrEmpty(data["businessName") ? false : true;
var name = isBusiness ? data["businessName"] : data["customerName"];
var id = isBusiness ? data["businessId"] : data["customerId"];
var phone = isBusiness ? data["businessPhone"] : data["customerPhone"];
var address = isBusiness ? data["businessAddress"] : data["customerAddress"];

这是一个小例子,所以实际差异会很小,但如果我像这样映射数百行怎么办?有些人关心isBusiness 标志,有些人不关心。有人有任何统计证据吗?

【问题讨论】:

  • 检查需要一个cpu周期,所以几百行没什么
  • 为什么要问?测量它。除此之外,我希望通过字符串访问索引器是代码中最慢的事情。如果你想优化你的代码,看看你的数据类是如何做到的。
  • 如果你在这里遇到性能问题,那肯定不是if语句引起的。这可能是由可怕的、基于魔术字符串的、无类型的 DataTable 内容引起的,其中所有内容都是 object 并且需要在运行时进行强制转换/装箱/拆箱。创建适当的数据模型或改用 ORM。
  • 如果你想知道你的马跑得有多快,你是在网上问陌生人还是给你的马计时?
  • @HighCore 我没有任何性能问题,这只是一个想法。不幸的是,我需要使用“可怕的、基于魔法字符串的、无类型的数据表的东西”,因为我正在映射分布在 10 个映射类中的 1000 多个字段。由于要求,我需要使用 DataTable。

标签: c# conditional-statements performance


【解决方案1】:

我认为这个问题没有明确的答案。这取决于有多少行等,唯一能回答的人是你。要对其进行测试,您只需使用 Stopwatch 类即可。

我不认为会有很多/任何区别,所以我会说 A,因为它更具可读性/可编辑性。

【讨论】:

    【解决方案2】:

    我同意这里的其他响应者;不过,我想补充一点。

    如果经常运行给定方法,则需要考虑 if 语句对性能的影响。如果你想了解更多关于这种影响性能的细节,我推荐阅读这篇关于conditional branching.的帖子

    话虽如此,我想说的是,通过更改第一行代码,您将获得微不足道的性能提升

    bool isBusiness = string.IsNullOrEmpty(data["businessName") ? false : true;
    

    到这里:

    bool isBusiness = !string.IsNullOrEmpty(data["businessName");
    

    不过,在这两个选项中,我更喜欢第一个

    这样做的原因是,如果您想提高代码的清晰度,可以从这里重构它:

    bool isBusiness = string.IsNullOrEmpty(data["businessName") ? false : true;
    if(isBusiness) {
       var name = data["businessName"];
       var id = data["businessId"];
       var phone = data["businessPhone"];
       var address = data["businessAddress"];
    }
    else {
       var name = data["customerName"];
       var id = data["customerId"];
       var phone = data["customerPhone"];
       var address = data["customerAddress"]; 
    }
    

    到这里:

    bool isBusiness = !string.IsNullOrEmpty(data["businessName");
    if(isBusiness) {
       this.MapBusinessRow(data);
    }
    else {
       this.MapCustomerRow(data)
    }
    

    不过,我必须说,这纯粹是为了可读性,而不是为了性能。

    归根结底,如果您担心的话;测试一下!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多