Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

perf(documentarray): refactor to use ES6 classes instead of mixins, 30% speedup #8037

Merged
merged 3 commits into from Aug 26, 2019

Conversation

@vkarpov15
Copy link
Collaborator

commented Jul 30, 2019

Before:

$ time node gh-7895.js 

real	0m10.777s
user	0m11.311s
sys	0m0.354s

After:

$ time node gh-7895.js 

real	0m7.058s
user	0m7.194s
sys	0m0.048s

Should be fine to release in 5.6.8, but I want to see if we can make this a little bit faster, because this is still slightly slower than Mongoose 4.13

@vkarpov15

This comment has been minimized.

Copy link
Collaborator Author

commented Jul 31, 2019

It looks like I managed to fix the tests by removing event emitter registration in the doc array constructor - it isn't strictly necessary because we can just set isNew normally. However, this means I'd like to defer this change to 5.7.0. It shouldn't be backwards breaking, but it feels a little too risky for a patch release.

@brettkiefer

This comment has been minimized.

Copy link

commented Jul 31, 2019

This looks great! I found something kind of funny running our test suite against it that I thought I'd alert you to. I'm not sure if you'd consider it to be a bug in util.inspect, in this change, or neither.

If you run this script on 336e995 (with node 10 and 12, at least), you'll get infinite recursion in inspect's formatValue and ultimately RangeError: Maximum call stack size exceeded, whereas with e.g. 5.6.5, it would inspect the subdoc array as expected.

'use strict';

const mongoose = require('.');
const { inspect } = require('util');

const SubdocSchema = mongoose.Schema({ a: String, b: String, c: String, d: String, e: String  });
const Schema = mongoose.Schema({ name: String, subdocs: { type: [SubdocSchema] } });
const Model = mongoose.model('Test', Schema);
const data = { _id: new mongoose.Types.ObjectId(), name: 'test', subdocs: [{a: 'a'}] };
const model = new Model();
model.init(data);
console.log(inspect(model.subdocs));

That may be something you'd expect consumers to work around, but I thought it was worth calling out.

@vkarpov15 vkarpov15 added this to the 5.7 milestone Aug 5, 2019
@vkarpov15

This comment has been minimized.

Copy link
Collaborator Author

commented Aug 5, 2019

Thanks @brettkiefer , I will look into this before merging

@vkarpov15 vkarpov15 changed the base branch from master to 5.7 Aug 26, 2019
@vkarpov15 vkarpov15 merged commit b4d8e8f into 5.7 Aug 26, 2019
2 checks passed
2 checks passed
continuous-integration/travis-ci/pr The Travis CI build passed
Details
continuous-integration/travis-ci/push The Travis CI build passed
Details
vkarpov15 added a commit that referenced this pull request Aug 26, 2019
vkarpov15 added a commit that referenced this pull request Aug 26, 2019
@brettkiefer

This comment has been minimized.

Copy link

commented Aug 29, 2019

To close the loop, f96a041 fixed the issue in our test suite that initially brought the infinite recursion issue up. Thank you!

@vkarpov15 vkarpov15 deleted the gh7895 branch Sep 4, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
2 participants
You can’t perform that action at this time.