Есть ли способ узнать, скомпилирована ли сборка C # с параметром оптимизации? - PullRequest
10 голосов
/ 20 августа 2010

Скорее, есть способ узнать, скомпилирован ли он с включенным или отключенным параметром оптимизации. Я не хочу знать, является ли это выпуском или отладкой, так как можно включить с оптимизацией или без нее. С моей точки зрения, хотя код говорит, что это релизная версия, действительно ли она оптимизирована? Спасибо.

Ответы [ 4 ]

9 голосов
/ 20 августа 2010

Один из способов проверить это посмотреть на DebuggableAttribute ( doc ) на сборке.Флаг DisableOptimizations не будет установлен, если компилятору C # был передан параметр / optimize.

Примечание. Хотя это будет работать для большинства сценариев, это не 100% надежное решение.Это может быть сломано, по крайней мере, следующими способами

  1. Компиляция с другим языком, который имеет другую семантику для оптимизации
  2. Если пользовательская рука определяет DebuggableAttribute, она будет иметь приоритет над тем, чтокомпилятор C # определяет
6 голосов
/ 20 августа 2010

Посмотрите на манифест сборки с помощью 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, Tools + Options, Debugging, General, «Подавить оптимизацию JIT при загрузке модуля».Вы хотите отключить эту опцию, если вы отлаживаете сборку Release и хотите сопоставить производительность.Это делает отладку более сложной, а действия ведут себя странно, так как оптимизатор перестраивает и вставляет код, и вы часто не можете проверить значения локальных переменных, поскольку они хранятся в регистрах ЦП.

3 голосов
/ 20 августа 2010

Этот пост может помочь вам http://www.panopticoncentral.net/archive/2004/02/03/267.aspx

В частности, в ildasm вы можете найти атрибут DebuggableAttribute и отсутствие NOP.

0 голосов
/ 14 апреля 2018

Я опоздал на 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());
}
...