Revision 90d4d71f3b2b76019fb6eb38d75dabe1c94ff871 authored by Valeri Karpov on 07 September 2022, 16:36:26 UTC, committed by Valeri Karpov on 07 September 2022, 16:36:26 UTC
1 parent 001dda3
Raw File
mem.js
'use strict';

const mongoose = require('../');

const Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/mongoose-bench');

const DocSchema = new Schema({
  title: String
});

const AllSchema = new Schema({
  string: { type: String, required: true },
  number: { type: Number, min: 10 },
  date: Date,
  bool: Boolean,
  buffer: Buffer,
  objectid: Schema.ObjectId,
  array: Array,
  strings: [String],
  numbers: [Number],
  dates: [Date],
  bools: [Boolean],
  buffers: [Buffer],
  objectids: [Schema.ObjectId],
  docs: {
    type: [DocSchema], validate: function() {
      return true;
    }
  },
  s: { nest: String }
});

const A = mongoose.model('A', AllSchema);

const methods = [];
methods.push(function(a, cb) {
  A.findOne({ _id: a._id }, cb);
}); // 2 MB
methods.push(function(a, cb) {
  A.find({ _id: a._id, bool: a.bool }, cb);
}); // 3.8 MB
methods.push(function(a, cb) {
  A.findById(a._id, cb);
}); // 4.6 MB
methods.push(function(a, cb) {
  A.where('number', a.number).limit(10).exec(cb);
}); // 4.8 MB
methods.push(function(a, cb) {
  A.where('date', a.date).select('string').limit(10).exec(cb);
}); // 3.5 mb
methods.push(function(a, cb) {
  A.where('date', a.date).select('string bool').limit(10).exec(cb);
}); // 3.5 MB
methods.push(function(a, cb) {
  A.where('date', a.date).where('array').in(3).limit(10).exec(cb);
}); // 1.82 MB
methods.push(function(a, cb) {
  A.updateOne({ _id: a._id }, { $addToset: { array: 'heeeeello' } }, cb);
}); // 3.32 MB
methods.push(function(a, cb) {
  A.deleteOne({ _id: a._id }, cb);
}); // 3.32 MB
methods.push(function(a, cb) {
  A.find().where('objectids').exists().select('dates').limit(10).exec(cb);
}); // 3.32 MB
methods.push(function(a, cb) {
  A.count({ strings: a.strings[2], number: a.number }, cb);
}); // 3.32 MB
methods.push(function(a, cb) {
  a.string = 'asdfaf';
  a.number = 38383838;
  a.date = new Date;
  a.bool = false;
  a.array.push(3);
  a.dates.push(new Date);
  // a.bools.push([true, false]);
  a.docs.addToSet({ title: 'woot' });
  a.strings.remove('three');
  a.numbers.pull(72);
  a.objectids.$pop();
  a.docs.pull.apply(a.docs, a.docs);
  a.s.nest = 'aooooooga';

  if (i % 2) {
    a.toObject({ depopulate: true });
  } else {
    if (a._delta) {
      a._delta();
    } else {
      a.$__delta();
    }
  }

  cb();
});

const started = process.memoryUsage();
const start = new Date;
const total = 10000;
let i = total;

function done() {
  const time = (new Date - start);
  const used = process.memoryUsage();

  const res = {};
  res.rss = used.rss - started.rss;
  res.heapTotal = used.heapTotal - started.heapTotal;
  res.heapUsed = used.heapUsed - started.heapUsed;

  console.error('took %d ms for %d docs (%d dps)', time, total, total / (time / 1000), 'change: ', res);

  mongoose.connection.db.dropDatabase(function() {
    mongoose.connection.close();
  });
}

function cycle() {
  if (i-- === 0) {
    return done();
  }
  let a = new A({
    string: 'hello world',
    number: 444848484,
    date: new Date,
    bool: true,
    buffer: Buffer.alloc(0),
    objectid: new mongoose.Types.ObjectId(),
    array: [4, {}, [], 'asdfa'],
    strings: ['one', 'two', 'three', 'four'],
    numbers: [72, 6493, 83984643, 348282.55],
    dates: [new Date, new Date, new Date],
    bools: [true, false, false, true, true],
    buffers: [Buffer.from([33]), Buffer.from([12])],
    objectids: [new mongoose.Types.ObjectId],
    docs: [{ title: 'yo' }, { title: 'nowafasdi0fas asjkdfla fa' }]
  });

  a.save(function() {
    methods[Math.random() * methods.length | 0](a, function() {
      a = null;
      process.nextTick(cycle);
    });
  });

  /* if (i%2)
    a.toObject({ depopulate: true });
  else
    a._delta();

  if (!(i%50)) {
    var u = process.memoryUsage();
    console.error('rss: %d, vsize: %d, heapTotal: %d, heapUsed: %d',
        u.rss, u.vsize, u.heapTotal, u.heapUsed);
  } */
}

mongoose.connection.on('open', function() {
  mongoose.connection.db.dropDatabase(function() {
    cycle();
    // --trace-opt --trace-deopt --trace-bailout
  });
});
back to top