【发布时间】:2010-08-20 18:02:08
【问题描述】:
相反,有没有办法判断它是在启用还是禁用优化参数的情况下编译的。我不想知道它是发布还是调试,因为可以启用或不启用优化。从我的角度来看,即使代码说它是发布版本,它真的优化了吗?谢谢。
【问题讨论】:
标签: c# optimization assemblies
相反,有没有办法判断它是在启用还是禁用优化参数的情况下编译的。我不想知道它是发布还是调试,因为可以启用或不启用优化。从我的角度来看,即使代码说它是发布版本,它真的优化了吗?谢谢。
【问题讨论】:
标签: c# optimization assemblies
我迟到了 8 年,但如果你和我一样想要 C# 方式,那就是:
using System.ComponentModel;
using System.Diagnostics;
using System.Reflection;
internal static class AssemblyExtensions
{
public static bool IsOptimized(this Assembly asm)
{
var att = asm.GetCustomAttribute<DebuggableAttribute>();
return att == null || att.IsJITOptimizerDisabled == false;
}
}
作为扩展方法:
static void Main(string[] args)
{
Console.WriteLine("Is optmized: " + typeof(Program).Assembly.IsOptimized());
}
【讨论】:
一种检查方法是查看程序集上的DebuggableAttribute (doc)。如果 C# 编译器通过了 /optimize 选项,则不会设置 DisableOptimizations 标志。
注意:尽管这适用于大多数情况,但这并不是 100% 万无一失的解决方案。至少可以通过以下方式破解它
DebuggableAttribute,它将优先于 C# 编译器定义的内容【讨论】:
使用 Ildasm.exe 查看程序集清单:
// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(
valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes)
= ( 01 00 02 00 00 00 00 00 )
这是发布版本。调试构建值为 ( 01 00 07 01 00 00 00 00 )
另一个问题是调试器可以禁用 JIT 优化器。这是 VS、工具 + 选项、调试、常规、“抑制模块加载时的 JIT 优化”中的一个可配置选项。如果您正在调试 Release 版本并想要相当的性能,您希望关闭它。它使调试更具挑战性,随着优化器重新排列和内联代码,单步执行的行为很奇怪,而且您通常无法检查局部变量的值,因为它们存储在 CPU 寄存器中。
【讨论】:
这篇文章可能对您有所帮助http://www.panopticoncentral.net/archive/2004/02/03/267.aspx
具体来说,在 ildasm 中,您可以查找 DebuggableAttribute 和 NOP 的缺失。
【讨论】: