PostSharp.Samples / PostSharp.Samples.MiniProfiler
Project Description

MiniProfiler from the makers of StackOverflow is one of the most popular and most useful libraries for ASP.NET developers. Thanks to MiniProfiler, you can easily track the execution time of selected methods.

Contrarily to normal profilers that track the execution time of all methods, MiniProfiler tracks only the time of methods you specifically select.

The problem with MiniProfiler is that you have to modify your code to add a call to the MiniProfiler.Step method. This can be cumbersome if you have dozens or even hundreds of them.

PostSharp offers a convenient way to add MiniProfiler to a large set of methods without having to modify the source code of these methods.

In this example, the MiniProfilerStepAttribute aspect is responsible for calling the MiniProfiler.Step method before method executions, and closing the step after execution. This aspect uses the OnMethodBoundaryAspect class and is very simple.

We want to measure the execution time off public methods all controllers and services. This is implemented by the following two lines in AssemblyInfo.cs:

[assembly: MiniProfilerStep(AttributeTargetTypes = "*Service", AttributeTargetMemberAttributes = MulticastAttributes.Public)]
[assembly: MiniProfilerStep(AttributeTargetTypes = "*Controller", AttributeTargetMemberAttributes = MulticastAttributes.Public)]

Note how this example relies on naming conventions to identify service and controller classes.

Let's go back to the MiniProfilerStepAttribute class. Note that the methodName name is initialized at build time in the CompileTimeInitialize method. This is a performance optimization trick. At runtime, there is no need for reflection, and no need to allocate new strings at each method call.

What is being demonstrated?

This example demonstrates the following techniques:

  • The OnMethodBoundaryAspect aspect.
  • Multicasting the aspect to several methods by filtering on type name and method attributes.

Thanks to this aspect, you can add MiniProfiler to dozens of methods in just a few lines of code.