Я только что проверил, используя этот код .(Обратите внимание, что я обошел ограничение , указанное в ответе Вим Коенена , используя атрибут MethodImpl . У меня есть сомнения относительно того, является ли это верным обходным решением.)
Результаты:
Raised event using reflection 1000 times in 25.5334 ms.
Raised event WITHOUT reflection 1000 times in 0.01 ms.
Итак, вы видите, что решение, включающее трассировку стека, в примерно в 2500 раз дороже"нормального" решения.
Это пропорциональноответь в любом случае.Лично мне не нравится эта идея (хотя и умная) по причинам, выходящим за рамки только производительности;но, очевидно, это ваш звонок.
Редактировать : Для записи я был вынужден написать сообщение в блоге об этом - в частности, отот факт, что некоторые разработчики будут испытывать искушение использовать подобный подход, несмотря на снижение производительности.
Согласны ли вы с моими чувствами по этому вопросу или нет (я понимаю, что снижение производительности незначительно в абсолютные термины), я чувствую, что реальный смертельный удар по этой идее заключается в том, что для того, чтобы она была даже удаленно устойчивой, необходимо украсить каждый установщик свойств, из которого вы намереваетесь вызывать RaisePropertyChanged
с атрибутом MethodImpl
, пропускающим MethodImplOptions.NoInlining
..., что прямо здесь сводит на нет все те сбережения при печати, которые вы получили в противном случае.
Таким образом, вы остаетесь с чистыми потерями во времени разработки (однакомного секунд потребовалось, чтобы вы набрали всю MethodImpl
часть атрибута), плюс штраф за производительность.Очень мало причин идти по этому пути, если вы спросите меня.