Uploaded image for project: 'C# Driver'
  1. C# Driver
  2. CSHARP-4307

Optimize class and collection deserialization

    • Type: Icon: Task Task
    • Resolution: Duplicate
    • Priority: Icon: Unknown Unknown
    • None
    • Affects Version/s: None
    • Component/s: BSON
    • Labels:
      None

      Class deserializer has many work with reflection , excess loop checks, set values to properties produce boxing

      Collection deserialization create excess list instead of return the ready one and again - REFLECTION....

      I solved these problems:

      https://github.com/mongodb/mongo-csharp-driver/pull/871

      1. optimized create instance - without reflection
      2. optimized set values to properties- without reflection, boxing, interface virtualization impact (for Deserialize Call)
      3. optimized collection deserialization- in most cases we can just return prepared List, in some other cases - removed reflection
      4. cache IsReadonly
      5. dont call SetRequiredFields if required fields does not exists (flag of required fields exist was cached)
      6. seporate deserialization of classes with default constructor and classes with creatorMap (to get rid of null checks)
      7. add generic BsonMemberMap for some optimizations above
      8. fix one test , that used local culture in Parse method and failed
        var expectedResult = decimal.Parse(expectedResultString, CultureInfo.InvariantCulture); – pass culture here

      Links:

      1) PR: https://github.com/mongodb/mongo-csharp-driver/pull/871

      2) Test Project: https://github.com/troepolik/testMongoDBPerformance

      just set reference to BSON project, sure you set release mode and run, and press to repeate several times to see statistics, then switch to my optimized project. 

      Sugestion: press repeat in moment when CPU% is low.

            Assignee:
            boris.dogadov@mongodb.com Boris Dogadov
            Reporter:
            aleksei.troepolskii@altenar.com Aleksei Troepolskii
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: