Я в основном хочу написать регистратор / трассировщик клиента, который также регистрирует класс и имя метода, вызывающего регистратор / трассировщик. Это должно быть быстрым, чтобы оно не влияло на производительность приложения, строго типизировано и чисто. У кого-нибудь есть хорошие идеи?
Вот те немногие, которые у меня были, но я беспокоюсь о производительности из-за рефлексии:
StackTrace / StackFrame (слишком много накладных расходов?)
MethodInfo.GetCurrentMethod () (все еще слишком медленно? И не очень чисто)
передать метод в качестве делегата (C # может сделать это неявно, и у меня есть доступ к MethodInfo, но не очень чисто)
Я ценю чьи-либо комментарии.
UPDATE:
Мне понравилась чистота StackFrame, поэтому я задал более конкретный вопрос здесь относительно производительности StackFrame, и я получил несколько действительно хороших ответов, включая тесты производительности. Оказывается, что MethodInfo.GetCurrentMethod()
является самым быстрым (занимает около 1 микросекунды на моем компьютере) и new StackFrame(1)
может быть запрошено по требованию (занимает около 15-20 микросекунд на моем компьютере). Я выбросил метод в качестве опции делегата, поскольку он слишком запутан, когда метод имеет несколько параметров.
ВЫВОД:
Я рассмотрел все параметры, и лучше всего написать собственный плагин для PostSharp, который вводит имя метода в виде строки в MSIL во время компиляции при применении к нему пользовательского атрибута, например [Trace]
. На мой взгляд, это самый быстрый и самый приемлемый вариант. Это даже позволяет намного больше вещей, таких как передача имен параметров и аргументов без какого-либо отражения, а также автоматическое обнаружение и запись исключений. Это мой связанный вопрос для получения дополнительной информации.