nhibernate / fluent-nhibernate

Fluent NHibernate!
BSD 3-Clause "New" or "Revised" License
1.66k stars 686 forks source link

Replace ConstructorInfo Invoke with CreateInstance for improved performance #646

Closed bethmaloney closed 6 months ago

bethmaloney commented 8 months ago

Reflection is used in the PersistenceModel to initialize the mapping classes. Currently we're using the ConstructorInfo.Activate function to create the mapping objects. Activator.CreateInstance is a bit more than twice as fast and is less code.

Unfortunately, there's a fair bit of work happening in the mapping constructors so we don't see such a dramatic improvement in initialization time. Benchmarking the change against actual mapping classes and the initialization time drops by a few percentage points depending on the complexity of class.

Benchmarking the construction time of the ProductMap class in the example project

| Method            | Mean     | Error    | StdDev   |
|------------------ |---------:|---------:|---------:|
| ConstructorInfo   | 52.47 us | 1.042 us | 1.070 us |
| ActivatorInstance | 50.50 us | 0.628 us | 0.557 us |

Not a huge performance increase but it's an easy change to make.

bethmaloney commented 7 months ago

@hazzik Sorry for pinging you but the PR has been open for over a month now. Is there something I can do to make this PR easier to review?