【问题标题】:Performance wise difference between returning direct initialization and storing in variable返回直接初始化和存储在变量中的性能差异
【发布时间】:2017-07-28 07:55:25
【问题描述】:

两者之间是否有任何区别(性能方面):

public User GetUser1()
{
    var user = _database.User.First();
    return user;
}

public User GetUser2()
    return _database.User.First();
}

【问题讨论】:

  • 编译器无疑会立即优化变量,为两种方法生成相同的 IL。因此,直接回答您的问题,两者之间没有性能差异。
  • 您可以通过使用ildasm 将编译后的可执行文件转换为文本来亲自查看。见这里:stackoverflow.com/a/7232029
  • 附带说明:从调试的角度来看,我更喜欢选项 1,因为我经常在单步执行时检查项目。
  • @itsme86 这就是我想听到的。非常感谢。
  • @StevePy 就像我一样,我总是更喜欢选项 1,这就是我想知道的,它是否坏。

标签: c#


【解决方案1】:

这是来自我数据库中相同函数的 C# 7.0 的 LINQPad 的输出:

GetUser1:
IL_0000:  ldarg.0     
IL_0001:  call        LINQPad.User.TypedDataContext.get_Users
IL_0006:  call        System.Linq.Queryable.First<User>
IL_000B:  ret         

GetUser2:
IL_0000:  ldarg.0     
IL_0001:  call        LINQPad.User.TypedDataContext.get_Users
IL_0006:  call        System.Linq.Queryable.First<User>
IL_000B:  ret         

这是关闭优化的输出。请注意,NOPs 和 BR.S 用于调试/断点。

GetUser1:
IL_0000:  nop         
IL_0001:  ldarg.0     
IL_0002:  call        LINQPad.User.TypedDataContext.get_Users
IL_0007:  call        System.Linq.Queryable.First<User>
IL_000C:  stloc.0     // user
IL_000D:  ldloc.0     // user
IL_000E:  stloc.1     
IL_000F:  br.s        IL_0011
IL_0011:  ldloc.1     
IL_0012:  ret         

GetUser2:
IL_0000:  nop         
IL_0001:  ldarg.0     
IL_0002:  call        LINQPad.User.TypedDataContext.get_Users
IL_0007:  call        System.Linq.Queryable.First<User>
IL_000C:  stloc.0     
IL_000D:  br.s        IL_000F
IL_000F:  ldloc.0     
IL_0010:  ret         

【讨论】:

  • 不多说了。非常感谢。
  • 你比我快!
  • 而在你更新你的答案之后,这意味着有两个额外的说明。重要吗?
  • 嗯,优化关闭。我看到运行该函数 1000 次会导致大约 5% 的性能损失,这对于 1000 次运行来说大约是 0.05 秒。大声笑 - 运行 6000 次,有时一个更快,有时另一个。服务器业务和网络延迟淹没了差异。 JITter 也有可能无论如何都在优化 IL,所以你不能总是通过查看 IL 来判断最终效率。
  • 将数据库调用替换为DateTime.Now,我发现在未优化超过 10,000,000 次调用的情况下,第二种形式的加速大约提高了 8%,总共大约 0.3 秒。
猜你喜欢
  • 2015-07-16
  • 2017-07-01
  • 2015-06-22
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多