C# 返回直接初始化和存储在变量中的性能差异

C# 返回直接初始化和存储在变量中的性能差异,c#,C#,以下各项之间是否存在任何差异(性能方面): 以下是LINQPad for C#7.0从我的数据库上的相同函数中的输出: 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:

以下各项之间是否存在任何差异(性能方面):


以下是LINQPad for C#7.0从我的数据库上的相同函数中的输出:

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         

编译器无疑会立即优化变量,为两种方法生成相同的IL。因此,为了直接回答您的问题,这两者之间没有性能差异。您可以通过使用
ildasm
将编译后的可执行文件转换为文本来了解这一点。请参见此处:旁注:从调试的角度来看,我更喜欢选项1,因为我经常在单步执行时查看项目。@itsme86这正是我想要听到的。非常感谢。@StevePy和我一样,我总是更喜欢选项1,这就是我想知道的,它是坏是坏。不要再说了。非常感谢。你比我快!在你更新你的答案后,这意味着还有两个额外的说明。这有意义吗?嗯,那是在优化关闭的情况下。我看到1000次运行函数会造成5%的性能损失,1000次运行大约0.05秒。哈哈——跑6000次,有时一个跑得更快,有时另一个跑得更快。服务器业务和网络延迟掩盖了这些差异。抖动也有可能优化了IL,所以你不能总是从IL中分辨出最终的效率。用
DateTime替换数据库调用。现在
,我看到第二种形式的加速约为8%,超过10000000次调用未优化,总共约0.3秒。
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         
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