Какие атрибуты помогают повысить производительность .Net во время выполнения?
-
09-06-2019 - |
Вопрос
Я ищу атрибуты, которые можно использовать для обеспечения наилучшей производительности моего приложения .Net во время выполнения, предоставляя подсказки загрузчику, JIT-компилятору или ngen.
Например, у нас есть Дебаггаблеатрибуте который должен быть настроен так, чтобы не отлаживать и не отключать оптимизацию для оптимальной производительности.
[Debuggable(false, false)]
Есть ли еще какие-нибудь, о которых мне следует знать?
Решение
Ecma-335 определяет еще несколько CompilationRelaxations для смягченной обработки исключений (так называемые электронные расслабленные вызовы) в Приложении F «Неточные ошибки», но они не были раскрыты Microsoft.
В частности, там упоминаются CompilationRelaxations.RelaxedArrayExceptions и CompilationRelaxations.RelaxedNullReferenceException.
Было бы интересно, что произойдет, если вы просто попробуете несколько целых чисел в векторе CompilationRelaxationsAttribute;)
Другие советы
И другой:Литеральные строки (строки, объявленные в исходном коде) по умолчанию интернированный в пул для экономии памяти.
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.
Хотя это экономит память, когда одна и та же литеральная строка используется несколько раз, на поддержание пула тратится некоторое количество процессора, и как только строка помещается в пул, она остается там до тех пор, пока процесс не будет остановлен.
С использованием СборникРасслабленияАтрибут вы можете сообщить JIT-компилятору, что вы действительно не хотите, чтобы он интернировал все литеральные строки.
[assembly: CompilationRelaxations(CompilationRelaxations.NoStringInterning)]
Я нашел другое: NeutralResourcesLanguageAttribute.В соответствии с этот Сообщение в блоге помогает загрузчику быстрее находить нужные вспомогательные сборки, указывая культуру текущей (нейтральной) сборки.
[NeutralResourcesLanguageAttribute("nl", UltimateResourceFallbackLocation.MainAssembly)]