在 C# 中使用 'unnecessary' 局部变量的性能损失?
Performance penalty for using 'unnecessary' local variable in C#?
使用额外的局部变量存储方法的结果是否会降低性能?
public string void ToFunkyDutchDate(DateTime this theDate) {
var result = string.Format("{0:dd-MM-yyyy}", theDate);
return result;
}
在类似的微不足道的情况下,我什至可以立即 return 格式化字符串。但这只是一个简单的例子,因为在稍微复杂一点的函数中我经常使用这种'trick'先将结果赋给一个临时局部变量
我这样做的主要原因是这样可以更轻松地进行调试。我可以在 return result;
行上放置一个断点,运行 并检查我的函数得出的结果是否正确。
但是额外的临时 result
变量仍然感觉有点像没有以下选项的性能不佳:"
public static string ToFunkyDutchDate(DateTime this theDate) {
return string.Format("{0:dd-MM-yyyy}", theDate);
}
我通过三种方式缓解了这种烦人的感觉:
- 任何性能下降都可以忽略不计
- 有一个像
result
这样的变量使代码比 return very long multi-line expression
更易读,这更糟糕的是性能下降
- 如果 C-sharp 的编译器在任何地方都不错——我认为它是——那么它应该编译掉额外的变量。例如。使生成的字节码与函数在不使用临时变量的情况下立即 returned 计算结果完全相同。立即(当不在调试模式下 运行ning 时) - 或者可能在进行 optimized/production 构建时(
/optimize+
)。
但我已经做了这么多年,写了这么多行代码,我想我终于要问了。这里有知道的编译器向导吗? :)
编辑:一分钟内回答一个酝酿多年的问题。 Whosebug 有多棒。很棒的工具:http://tryroslyn.azurewebsites.net/
通常没有速度差异。例如参见 [=10=]
两个版本的代码在发布模式下生成相同的 IL 代码。
在调试模式下,IL 代码稍长(因为对局部变量的存储是显式的):http://goo.gl/KCkORV
我刚刚 运行 通过 LinqPad 的两种方法并查看它提供的 IL 有两个指令的变化:
使用未使用的变量:
IL_0000: ldstr "{0:dd-MM-yyyy}"
IL_0005: ldarg.0
IL_0006: box System.DateTime
IL_000B: call System.String.Format
IL_0010: stloc.0 // result
IL_0011: ldloc.0 // result
IL_0012: ret
直接返回string.Format
的结果:
IL_0000: ldstr "{0:dd-MM-yyyy}"
IL_0005: ldarg.0
IL_0006: box System.DateTime
IL_000B: call System.String.Format
IL_0010: ret
这两个额外的调用会不会是一个性能问题,不太可能,但我很难说我不知道这个区域有多重要。
使用额外的局部变量存储方法的结果是否会降低性能?
public string void ToFunkyDutchDate(DateTime this theDate) {
var result = string.Format("{0:dd-MM-yyyy}", theDate);
return result;
}
在类似的微不足道的情况下,我什至可以立即 return 格式化字符串。但这只是一个简单的例子,因为在稍微复杂一点的函数中我经常使用这种'trick'先将结果赋给一个临时局部变量
我这样做的主要原因是这样可以更轻松地进行调试。我可以在 return result;
行上放置一个断点,运行 并检查我的函数得出的结果是否正确。
但是额外的临时 result
变量仍然感觉有点像没有以下选项的性能不佳:"
public static string ToFunkyDutchDate(DateTime this theDate) {
return string.Format("{0:dd-MM-yyyy}", theDate);
}
我通过三种方式缓解了这种烦人的感觉:
- 任何性能下降都可以忽略不计
- 有一个像
result
这样的变量使代码比return very long multi-line expression
更易读,这更糟糕的是性能下降 - 如果 C-sharp 的编译器在任何地方都不错——我认为它是——那么它应该编译掉额外的变量。例如。使生成的字节码与函数在不使用临时变量的情况下立即 returned 计算结果完全相同。立即(当不在调试模式下 运行ning 时) - 或者可能在进行 optimized/production 构建时(
/optimize+
)。
但我已经做了这么多年,写了这么多行代码,我想我终于要问了。这里有知道的编译器向导吗? :)
编辑:一分钟内回答一个酝酿多年的问题。 Whosebug 有多棒。很棒的工具:http://tryroslyn.azurewebsites.net/
通常没有速度差异。例如参见 [=10=]
两个版本的代码在发布模式下生成相同的 IL 代码。
在调试模式下,IL 代码稍长(因为对局部变量的存储是显式的):http://goo.gl/KCkORV
我刚刚 运行 通过 LinqPad 的两种方法并查看它提供的 IL 有两个指令的变化:
使用未使用的变量:
IL_0000: ldstr "{0:dd-MM-yyyy}"
IL_0005: ldarg.0
IL_0006: box System.DateTime
IL_000B: call System.String.Format
IL_0010: stloc.0 // result
IL_0011: ldloc.0 // result
IL_0012: ret
直接返回string.Format
的结果:
IL_0000: ldstr "{0:dd-MM-yyyy}"
IL_0005: ldarg.0
IL_0006: box System.DateTime
IL_000B: call System.String.Format
IL_0010: ret
这两个额外的调用会不会是一个性能问题,不太可能,但我很难说我不知道这个区域有多重要。