Какие атрибуты помогают производительности .Net во время выполнения?

Я ищу атрибуты, которые я могу использовать для обеспечения максимальной производительности моего .Net-приложения, давая подсказки загрузчику, JIT-компилятору или ngen.

Например, у нас есть DebuggableAttribute, который должен быть установлен, чтобы не отлаживать и не отключать оптимизацию для оптимальной производительности.

[Debuggable(false, false)]

Есть ли другие, о которых мне следует знать?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
14
0
2 288
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Нашел другой: 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)]

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

csgero 30.09.2008 16:19

Верно, но тогда вам придется написать код, который явно использует интернирование строк. А поскольку вы не можете рассчитывать на интернирование литералов, вам придется сделать это самостоятельно (String.Intern). Упомянутый здесь атрибут на это не влияет.

Lars Truijens 30.09.2008 19:06

Оператор == для строки знает, нужно ли сравнивать ссылки или содержимое. Похоже, что точка csgero заключалась в том, что в неинтернированном случае оператор == всегда должен выполнять сравнения на основе содержимого, которые могут быть более дорогостоящими, чем сравнение на основе ссылок для интернированных строк.

David Schmitt 06.12.2011 18:08
Ответ принят как подходящий

Ecma-335 определяет еще несколько вариантов CompilationRelaxations для упрощенной обработки исключений (так называемые электронные расслабленные вызовы) в Приложении F «Неточные ошибки», но они не были обнаружены Microsoft.

В частности, там упоминаются исключения CompilationRelaxations.RelaxedArrayExceptions и CompilationRelaxations.RelaxedNullReferenceException.

Было бы интересно, что произойдет, если вы просто попробуете несколько целых чисел в ctor CompilationRelaxationsAttribute;)

Другие вопросы по теме