2008-09-16 6 views
14

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

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

[Debuggable(false, false)] 

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

ответ

5

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

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

Было бы межжала, что происходит, когда вы просто попробовать некоторые целые числа в CTOR в CompilationRelaxationsAttribute в;)

1

Я нашел другое: NeutralResourcesLanguageAttribute. Согласно сообщению в блоге this, он помогает загрузчику быстрее находить нужные сборочные узлы, указывая культуру, если текущая (нейтральная) сборка.

[NeutralResourcesLanguageAttribute("nl", UltimateResourceFallbackLocation.MainAssembly)] 
2

И еще: Символьные строки (строки, объявленные в исходном коде), по умолчанию interned в пул, чтобы сохранить память.

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)] 
+1

Будьте осторожны с этим, так как не интернирование строки фактически может повредить производительности. Сравнение равенства для интернированных строк может быть выполнено путем простого сравнения ссылок (указателей), которые намного быстрее, чем сравнение строковых значений. – csgero 2008-09-30 12:19:53

+0

Правда, но тогда вам придется писать код, который явно использует интернирование строк. И поскольку вы не можете рассчитывать на то, что литералы будут интернированы, вам придется сделать это самостоятельно (String.Intern). Атрибут, упомянутый здесь, не влияет на это. – 2008-09-30 15:06:23