Это очень интересный вопрос.
Нет действительно простого способа отследить события без какого-либо дополнительного кода. Это не означает, что добавление кода должно быть сложным или привести к снижению производительности.
Если во всех ваших событиях используются пользовательские eventArgs, вы можете добавить в конструктор простую инструкцию регистрации, которая позволит вам считать каждый раз, когда вы создаете один из пользовательских eventArgs.
Если вы не используете настраиваемые eventArgs, вы можете очень легко расширить eventArgs с помощью класса customEventArgs, который выполняет именно этот подсчет. Просто расширьте конструктор, чтобы обновить некоторую статическую переменную, которую вы можете записывать в журнал время от времени. Затем, используя быстрый рефакторинг, вы можете переименовать все ваши стандартные EventArgs в этот новый немного другой customEventArgs. Это займет все 10 минут и не нарушит существующий код.
Однако, если вы знаете, что профилировщик может это сделать, почему бы не использовать его? Если это гигантское приложение и вы пытаетесь выполнить очень небольшие оптимизации, для кого бы вы ни создавали это приложение, вероятно, не будут возражать против дополнительных расходов, связанных с приобретением вами лицензии в обмен на улучшения их программного обеспечения.