C# 字典性能

C# 字典性能,c#,C#,teo片段之间有什么区别 片段1: { Dictionary<MyCLass, bool> dic; MyFunc(out dic); } { 词典; MyFunc(外部dic); } 片段2: { Dictionary<MyCLass, bool> dic = null; MyFunc(out dic); } { 字典dic=null; MyFunc(外部dic); } 代码段2的性能更好吗?从技术上讲,通过执行冗余的null集,第二个代码段可能

teo片段之间有什么区别

片段1:

{
  Dictionary<MyCLass, bool> dic;
  MyFunc(out dic);
}
{
词典;
MyFunc(外部dic);
}
片段2:

{
  Dictionary<MyCLass, bool> dic = null;
  MyFunc(out dic);
}
{
字典dic=null;
MyFunc(外部dic);
}

代码段2的性能更好吗?

从技术上讲,通过执行冗余的
null
集,第二个代码段可能会比第一个代码段执行更多的指令。我在这里用“可能”来避险,因为C#规范可能允许灵活地忽略这个集合。我现在还不知道


然而,我会严重怀疑这是否会显著影响应用程序的性能。我当然不会为这种优化编写代码,而是更喜欢我认为更容易理解的解决方案

从技术上讲,第二个代码段可能会通过执行冗余的
null
集来执行比第一个更多的指令。我在这里用“可能”来避险,因为C#规范可能允许灵活地忽略这个集合。我现在还不知道


然而,我会严重怀疑这是否会显著影响应用程序的性能。我当然不会为这种优化编写代码,而是更喜欢我认为更容易理解的解决方案

我喜欢snippet 2,它速度较慢,但减少错误的实践效果更好,总的来说,显式初始化变量是一个好习惯。也许即使是JIT也可以在访问时对其进行优化,这样您在编译和加载时(而不是在执行时)只会损失一点点性能(但我还没有验证这个调试器/反汇编程序,但JIT对于计算机程序来说是相当“智能”的,所以它可能能够做到)

我喜欢代码片段2,它速度较慢,但可以更好地减少错误,总的来说,显式使用-to-init变量是一个好习惯。也许甚至JIT也可以在访问时对其进行优化,这样在编译和加载时(而不是在执行时)只会损失一点点性能(但我还没有验证这个调试器/反汇编程序,但JIT对于计算机程序来说是相当“智能”的,所以它可能能够做到这一点)

当您还没有测量应用程序的性能时,不要担心这些问题

像这样的事情不太可能产生巨大的影响,事实上,大多数时候,像这样的事情与你写的其他行相比是不明显的


首先测量,他们会担心性能。

当您还没有测量应用程序的性能时,不要担心这些问题

像这样的事情不太可能产生巨大的影响,事实上,大多数时候,像这样的事情与你写的其他行相比是不明显的


首先测量,他们担心性能。

编译它们并比较IL。我想也是这样。out参数的存储应初始化为零(如果它是引用类型,则为null),然后再将其传递给被调用的方法。

编译它们并比较IL。我想也是这样。out参数的存储应初始化为零(如果是引用类型,则为null)在它传递给被调用的方法之前。

@Abdul我个人更喜欢第一个,因为第二个中的空集是冗余的。冗余空集是什么意思?@Abdul声明后的第一个操作是将
dic
作为
输出
参数传递。这意味着
MyFunc
中的代码在未首先写入现有值之前无法访问该值。因此,原始函数或
MyFunc
都看不到
null
值,这是多余的。创建字典的性能开销很大吗?@Abdul第二个代码片段不会真正影响您的性能。别再担心了,你甚至可能无法测量可能的性能损失。@Abdul我个人更喜欢第一个,因为第二个中的空集是冗余的。冗余空集是什么意思?@Abdul声明后的第一个操作是将
dic
作为
输出
参数传递。这意味着
MyFunc
中的代码在未首先写入现有值之前无法访问该值。因此,原始函数或
MyFunc
都看不到
null
值,这是多余的。创建字典的性能开销很大吗?@Abdul第二个代码片段不会真正影响您的性能。别再担心了,你甚至可能无法衡量可能的性能损失。