返回结果还是先将其放入变量?

Bat*_*rog 2 c# linq performance

我在MVC应用程序中使用LINQ.我注意到我可以通过两种方式创建一种方法,两种方法都有效,但我不知道哪种方法最好.

直接:

public string GetStatus(int PersonId)
{
    return db.PersonStatus
        .Where(x => x.personid == PersonId)
        .Select(x => x.Status)
        .Single();
}
Run Code Online (Sandbox Code Playgroud)

在var中首先:

public string GetStatus(int PersonId)
{
    string Item = db.PersonStatus
        .Where(x => x.personid == PersonId)
        .Select(x => x.Status)
        .Single();
    return Item;
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢第一种直接方法,因为它似乎更有效.如果两者之间存在显着差异,请告诉我,如果是,那么什么?

Bob*_*son 5

据我所知,两者之间没有实际差别(第二个可能会优化到第一个).使用LINQ和常规函数执行此操作也没有区别.

但是,第二个将更容易调试,因为您在评估之后将结果放在某处,因此您可以放入断点并检查该变量.不过,我发现第一个略显清晰.


这有两个功能:

int Foo(int a, int b)
{
    int x = a+b;
    return x;
}

int Bar(int a, int b)
{
    return a+b;
}
Run Code Online (Sandbox Code Playgroud)

这是通过优化生成的IL(根据LINQPad):

Foo:
IL_0000:  nop         
IL_0001:  ldarg.1     
IL_0002:  ldarg.2     
IL_0003:  add         
IL_0004:  stloc.0     // x
IL_0005:  ldloc.0     // x
IL_0006:  stloc.1     // CS$1$0000
IL_0007:  br.s        IL_0009
IL_0009:  ldloc.1     // CS$1$0000
IL_000A:  ret         

Bar:
IL_0000:  nop         
IL_0001:  ldarg.1     
IL_0002:  ldarg.2     
IL_0003:  add         
IL_0004:  stloc.0     // CS$1$0000
IL_0005:  br.s        IL_0007
IL_0007:  ldloc.0     // CS$1$0000
IL_0008:  ret         
Run Code Online (Sandbox Code Playgroud)

您会注意到它Foo有两个额外的行,它声明变量然后读取它.

在这里优化:

Foo:
IL_0000:  ldarg.1     
IL_0001:  ldarg.2     
IL_0002:  add         
IL_0003:  stloc.0     // x
IL_0004:  ldloc.0     // x
IL_0005:  ret         

Bar:
IL_0000:  ldarg.1     
IL_0001:  ldarg.2     
IL_0002:  add         
IL_0003:  ret    
Run Code Online (Sandbox Code Playgroud)

再次,一个额外的任务和负载.你永远不会注意到差异.

  • 优秀的分析!+1在这种情况下它可能不是非常适用,但值得一提的是,过早优化是所有邪恶的根源.:) (2认同)