You perform benchmark test for a method like BulkSaveChanges, but you get very bad performance result.
The performance issue may be caused by some common mistake:
- Forget to JIT compile the library
- Include method not related to the test
Forget to JIT compile the library
In C#, the code is compiled into IL by the compiler. Then when needed, the IL is compiled just-in-time (JIT) into the native assembly language of the host machine.
Additionally, some library like Entity Framework requires some extra work like creating/reading the model. Some people report the first load taking several second!
Entity Framework Extensions also take some time to be compiled. It can take around 100ms the first time you use a method! So if you include this time, your benchmark time is currently way higher at it should.
Invoke the method once before performing the benchmark test
Include method not related to the test
Someone once reported us a performance issue and though our BulkSaveChanges method was slow. We discovered he was including the time to Add every entity to the context.
The Add method was taken 99,9% of the total time while BulkSaveChanges only 0,1%.
|Operations||100 Entities||1,000 Entities||10,000 Entities|
|Add||15 ms||1,050 ms||105,000 ms|
|BulKSaveChanges||40 ms||90ms||400 ms|
The Add method doesn’t affect much the performance when adding 100 entities, but if you make your test with 10,000 entities:
- Add: 99.6%
- BulkSaveChanges: 0,4%
Include only the method you want to benchmark.
Here is an example how we normally do all our benchmarks tests