这种优化是否会减少内存使用?

时间:2014-08-15 09:37:18

标签: c#-4.0 memory optimization

采取(一个人为的)例子

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);   
}

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

但是,我认为第一个示例(附加分配)使用的内存多于第二个。因此轻松获胜。

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

我想知道我是否对作业的记忆使用是否正确?


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

2 个答案:

答案 0 :(得分:2)

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

更重要的一点是,如果你分配变量,你必须调用IsItStuff和FurtherChecking,无论CheckThing是通过还是失败,所以你正在进行不必要的处理,这通常更重要,因为它需要更长的时间功能完成。

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

答案 1 :(得分:1)

DoctorMick已经很好地解释了您的优化问题'实际上并不是一种优化。

即使您只编写此类代码并仅使用属性或变量(因此您不会使用昂贵的方法调用),优化程序也会内联,因此获得的结果将无效。

所以这个:

bool x = SomeVariable;

if (x)

将由编译器优化:

if (SomeVariable)

请注意,只有在以后不再在代码中重新分配x时才可以这样做。