【问题标题】:Does this optimisation reduce memory use?这种优化会减少内存使用吗?
【发布时间】:2014-08-15 09:37:17
【问题描述】:

举一个(人为的)例子

private bool CheckSomeThings() 
{
  var importantThing = GetImportantThing();
  var generatedOtherThing = DoFunkyStuff(importantThing);

  bool firstCheck = CheckThing(importantThing);
  bool otherCheck = IsItStuff(generatedOtherThing);
  bool furtherStuff = FurtherChecking(importantThing, generatedOtherThing);

  return firstCheck && otherCheck && furtherStuff;   
}

在编写/审查这样的代码时,我倾向于建议不要创建 bool 只是为了将其用作检查,所以我更喜欢

private bool CheckSomeThings() 
{
  var importantThing = GetImportantThing();
  var generatedOtherThing = DoFunkyStuff(importantThing);

  return CheckThing(importantThing) 
    && IsItStuff(generatedOtherThing) 
    && FurtherChecking(importantThing, generatedOtherThing);   
}

我发现第二个示例更具可读性,因为我不必解析创建的变量并检查它们是否在任何地方使用......但我承认这是主观的。

但是,我认为第一个示例(带有附加分配)比第二个示例使用更多的内存。所以轻松取胜。

虽然过早优化类似于打小狗,但导致此问题的实际代码将作为实时处理小技巧的一部分运行,因此优化内存使用可能是一个真正的问题。

我想知道我对分配导致的内存使用是否正确?


另外,是的,我们将通过内存分析器等运行系统以获取有关它如何执行的真实数据。这是一个简单的代码风格方法是否可以防止不必要的内存使用的问题。

【问题讨论】:

  • 代码不一样,你必须使用&而不是&&。微优化的常见问题是,它们倾向于在提高速度之前添加错误。
  • @HansPassant 为什么?如果你能指出我(或添加一个)好的解释,那就太棒了:)

标签: c#-4.0 memory optimization


【解决方案1】:

分配给这两个额外的变量将使用非常少量的额外内存,但对我来说这无关紧要,除非你有非常非常严格的内存使用要求,因为它很快就会被释放。

更重要的方面是,如果您分配变量,则无论 CheckThing 是通过还是失败,您都必须调用 IsItStuff 和进一步检查,因此您正在进行不必要的处理,这通常更重要,因为它需要更长的时间功能完成。

如果您使用第二个示例,if 语句将被短路,并且在返回第一个 false 后不会调用任何函数,因此在检查失败时会更有效。

【讨论】:

    【解决方案2】:

    DoctorMick 已经很好地解释了您的“优化”实际上不是优化。

    即使您编写这样的代码并仅使用属性或变量(这样您就不会使用昂贵的方法调用),优化器也会内联它,因此收益将一无所获。

    所以这个:

    bool x = SomeVariable;
    
    if (x)
    

    将被编译器优化为:

    if (SomeVariable)
    

    请注意,这只有在您稍后不在代码中重新分配 x 时才有可能。

    【讨论】:

    • 谢谢。我喜欢挑战我的假设并同时学习:)
    猜你喜欢
    • 2018-03-30
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2020-11-04
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多