Uploaded image for project: 'Java Driver'
  1. Java Driver
  2. JAVA-777

Inserting LazyDBObject is slow

    • Type: Icon: Task Task
    • Resolution: Done
    • Priority: Icon: Major - P3 Major - P3
    • None
    • Affects Version/s: None
    • Component/s: None
    • Labels:
      None

      Inserting a LazyDBObject with a large array (20000 ints) is extremely slow...on the order of 500x slower.

      Profiling shows the vast majority of the time is spent in the org.bson.io.BSONByteBuffer.getCString() call.

          @Test
          public void testLazyDocWithBigList() {
              DBCollection c = _db.getCollection("testLazyDotKeysPass");
              c.drop();
      
              DBObject obj = new BasicDBObject();
              ArrayList<Integer> arr = new ArrayList<Integer>();
              for(int i = 0; i < 20000; i++){
                  arr.add(i);
              }
              
              obj.put("largeArray", arr);
              obj.put("randomstr", "asdfasdfa");
              
              long start = System.currentTimeMillis();
              c.insert(obj);
              System.out.println("Save obj: " + (System.currentTimeMillis() - start));
              
              //convert to a lazydbobject
              DefaultDBEncoder encoder = new DefaultDBEncoder();
              byte[] encodedBytes = encoder.encode(obj);
      
              LazyDBDecoder lazyDecoder = new LazyDBDecoder();
              DBObject lazyObj = lazyDecoder.decode(encodedBytes, c);
      
              start = System.currentTimeMillis();
              c.insert(lazyObj);
              System.out.println("Save lazy obj: " + (System.currentTimeMillis() - start));
              
              //convert lazy to a regular dbobject and save
              start = System.currentTimeMillis();
              LazyDBEncoder lazyEncoder = new LazyDBEncoder();
              BasicOutputBuffer outputBuffer = new BasicOutputBuffer();
              lazyEncoder.writeObject(outputBuffer, lazyObj);
              
              DefaultDBDecoder defDecode = new DefaultDBDecoder();
              DBObject normalObject = defDecode.decode(outputBuffer.toByteArray(), c);
              
              c.insert(normalObject);
              System.out.println("Lazy to Basic and save " + (System.currentTimeMillis() - start));
          }
      

      Output

      Save obj: 72
      Save lazy obj: 35194
      Lazy to Basic and save 131
      

            Assignee:
            Unassigned Unassigned
            Reporter:
            steve.briskin Steve Briskin (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: