Я ищу атрибуты, которые я могу использовать для обеспечения максимальной производительности моего .Net-приложения, давая подсказки загрузчику, JIT-компилятору или ngen.
Например, у нас есть DebuggableAttribute, который должен быть установлен, чтобы не отлаживать и не отключать оптимизацию для оптимальной производительности.
[Debuggable(false, false)]
Есть ли другие, о которых мне следует знать?





Нашел другой: NeutralResourcesLanguageAttribute. Согласно сообщению в блоге это, это помогает загрузчику быстрее находить нужные вспомогательные сборки, указывая культуру для текущей (нейтральной) сборки.
[NeutralResourcesLanguageAttribute("nl", UltimateResourceFallbackLocation.MainAssembly)]
И еще: литеральные строки (строки, объявленные в исходном коде) по умолчанию интернированный помещаются в пул для экономии памяти.
string s1 = "MyTest";
string s2 = new StringBuilder().Append("My").Append("Test").ToString();
string s3 = String.Intern(s2);
Console.WriteLine((Object)s2==(Object)s1); // Different references.
Console.WriteLine((Object)s3==(Object)s1); // The same reference.
Хотя при многократном использовании одной и той же буквальной строки это экономит память, для обслуживания пула требуется некоторое количество ЦП, и после помещения строки в пул она остается там до тех пор, пока процесс не будет остановлен.
Используя Атрибут CompilationRelaxationsAttribute, вы можете сказать JIT-компилятору, что вы действительно не хотите, чтобы он интернировал все буквальные строки.
[assembly: CompilationRelaxations(CompilationRelaxations.NoStringInterning)]
Верно, но тогда вам придется написать код, который явно использует интернирование строк. А поскольку вы не можете рассчитывать на интернирование литералов, вам придется сделать это самостоятельно (String.Intern). Упомянутый здесь атрибут на это не влияет.
Оператор == для строки знает, нужно ли сравнивать ссылки или содержимое. Похоже, что точка csgero заключалась в том, что в неинтернированном случае оператор == всегда должен выполнять сравнения на основе содержимого, которые могут быть более дорогостоящими, чем сравнение на основе ссылок для интернированных строк.
Ecma-335 определяет еще несколько вариантов CompilationRelaxations для упрощенной обработки исключений (так называемые электронные расслабленные вызовы) в Приложении F «Неточные ошибки», но они не были обнаружены Microsoft.
В частности, там упоминаются исключения CompilationRelaxations.RelaxedArrayExceptions и CompilationRelaxations.RelaxedNullReferenceException.
Было бы интересно, что произойдет, если вы просто попробуете несколько целых чисел в ctor CompilationRelaxationsAttribute;)
Будьте осторожны с этим, так как отсутствие интернирования строк может на самом деле снизить производительность. Сравнение равенства для интернированных строк может быть выполнено путем простого сравнения ссылок (указателей), что намного быстрее, чем сравнение значений строк.