Настройка TraceSource, чтобы избежать создания TraceEventCache

В моем проекте много классов. Каждый класс использует TraceSource для регистрации. Я не хочу использовать TraceEventCache при ведении журнала. По сути, ответ на этот вопрос заключается в том, что мы можем сказать составителю списков не писать TraceEventCache с использованием TraceOptions (CallStack, ProcessID и т. Д.). Это означает, что TraceSource уже имеет TraceEventCache. Поэтому мой вопрос заключается в том, что методы TraceData и TraceEvent класса TraceSource создают TraceEventCache для каждого вызова? Или это просто один объект, созданный платформой для потока и используемый в классе TraceSource.

1 ответ

Ваш вопрос зависит от того, как вы думаете, как написан класс TraceSource. Лучше, чем спекулировать, вы можете проверить справочный исходный код, как Microsoft, так и Mono.

Во всяком случае, там вы можете видеть, что это вызывается для каждого вызова Trace (...)

TraceEventCache manager = new TraceEventCache(); 

Насколько я могу судить, единственный способ, которым он ведет себя как кеш, состоит в том, что свойства стека вызовов (и некоторые другие) откладывают определение своих значений до тех пор, пока не будут вызваны, и, если их вызывают дважды, возвращают значение из локальной переменной. Это потому, что такие вещи, как CallStack медленные. В противном случае TraceEventCache - это просто набор скучных свойств. Это не кеш, как встроенный кеш ASP.NET.

Чтобы повысить производительность, не говорите ни одному из слушателей трассировки выводить стек вызовов или что-то еще, что может быть медленным.

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