Mapper vs Mapper: Performance Revisited

Update: I have more up-to-date results than these, including updated versions of AgileMapper, AutoMapper and Mapster.

I recently wrote a blog on the performance of various object-object mappers, but it turns out my tests weren't quite fair and equal at that point. Specifically:

Creating Empty Collections vs... Not

ExpressMapper, Mapster and ValueInjecter were leaving target collections as null if their source value was null, which means AgileMapper, AutoMapper and the manual mappers I wrote were creating millions (and millions) of collection objects the other three mappers weren't. No fair!

Mapping Objects vs Copying Object References

In some instances, Mapster and ValueInjecter were copying references to the source objects instead of mapping the objects themselves. The ValueInjecter usage was more my mistake than anything (its Mapper.Map(source) doesn't perform a deep clone by default), but I raised a bug for the behaviour in Mapster, and it's going to be fixed in an upcoming release.

The Updated Results

So I've updated the relevant mapper classes and re-measured. As before, these are the total number of seconds to perform one million mappings:

 

Constructor

Complex

Flattening

Unflattening

Deep

Manual

0.00890

1.76716

0.05548

0.05300

0.50052

AgileMapper 0.8

0.17826

4.33683

0.38902

0.57726

1.15797

AutoMapper 5.1.1

0.15132

7.28190

0.36671

-

0.95540

ExpressMapper 1.8.3

0.21580

15.48691 ^

0.52166

-

6.56550 ^

Mapster 2.5.0

0.12014

2.50889 *

0.29629

-

1.69947

ValueInjecter 3.1.1.3

0.47637

101.70602 ^

12.67350

13.71370

28.05925

I've marked the major changes with a ^, and put a * next to Mapster's deep cloning result, because some of the objects in that test are having their reference copied instead of being cloned; it's likely to be significantly slower if that were not the case.

Points to Note

  • Mapster is still the fastest at churning out simple objects - it just gets slower when mapping nested object members
  • ValueInjecter's reflection-heavy approach is very costly, but as I understand it that is how it's intended to be used - as before, I'm happy to be corrected
  • I'm pleased to have improved AgileMapper's performance on every test - the complex type / deep-cloning is nearly 20% faster than in v0.6 :)

Update: I have more up-to-date results than these, including updated versions of AgileMapper, AutoMapper and Mapster.

Print | posted @ Tuesday, November 29, 2016 7:41 PM

Comments on this entry:

No comments posted yet.

Post A Comment
Title:
Name:
Email:
Comment:
Verification: