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: mongodb 4.3.0 option enableUtf8Validation #11638

Closed
Uzlopak opened this issue Apr 7, 2022 · 1 comment
Closed

Perf: mongodb 4.3.0 option enableUtf8Validation #11638

Uzlopak opened this issue Apr 7, 2022 · 1 comment
Labels
discussion If you have any thoughts or comments on this issue, please share them!

Comments

@Uzlopak
Copy link
Collaborator

Uzlopak commented Apr 7, 2022

From the release notes:


Performance
The original release of the 4.x driver relied on a new version of the BSON library that enables UTF-8 validation by default, resulting in noticeable performance degradation over the 3.x driver when processing over string data. This release introduces an option to opt out of this validation by specifying enableUtf8Validation: false at the client, database, collection, or individual operation level.

https://github.com/mongodb/node-mongodb-native/releases/tag/v4.3.0

We should consider to benchmark and make it possible to set it by the implementers. Also we should consider to create a performance optimization subpage in the docs.

@IslandRhythms IslandRhythms added the discussion If you have any thoughts or comments on this issue, please share them! label Apr 7, 2022
@vkarpov15 vkarpov15 added this to the 6.2.14 milestone Apr 14, 2022
@vkarpov15 vkarpov15 modified the milestones: 6.3.3, 6.3.6 May 5, 2022
@vkarpov15 vkarpov15 modified the milestones: 6.3.6, 6.3.7 Jun 7, 2022
@vkarpov15
Copy link
Collaborator

I took a look and it is possible to set the enableUtf8Validation option:

mongoose.connect('mongodb://localhost:27017/test', { enableUtf8Validation: false });

However, using the script from #11380, it doesn't look to have much impact. For the below script:

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/test', { enableUtf8Validation: true });

const RECORDS_AMOUNT = 10000;
const DATA_AMOUNT = { min: 40, max: 400, };

const slowsaveSchema = new mongoose.Schema({
    randomData: [String],
});
const slowsaveModel = mongoose.model('slowsave_experiment', slowsaveSchema);

let last100_count=0, last100_sum=0, total_count=0, total_sum=0;
async function addData() {
    const record = new slowsaveModel();
    for (let i = 0; i < Math.random()*(DATA_AMOUNT.max-DATA_AMOUNT.min) + DATA_AMOUNT.min; ++i) {
        record.randomData.push(Math.random());
    };

    const startTime = Date.now();
    await record.save();
    const time= Date.now()-startTime;;
    
    last100_count++; total_count++;
    last100_sum+=time; total_sum+=time;
    if (last100_count>=100) {
        console.log(`l100.avg=${last100_sum/last100_count}, total.avg=${total_sum/total_count}`)
        last100_count=0;
        last100_sum=0;
    }
};

async function main() {
    for (let i = 0; i < RECORDS_AMOUNT; i++) {
        setTimeout(async () => {
            await addData();
        }, Math.floor(Math.random()*2000 + 2000));
    }
};

main();

With enableUtf8Validation: false I get:

$ node gh-11380.js 
l100.avg=5143, total.avg=5143
l100.avg=5144.31, total.avg=5143.655
l100.avg=5093.81, total.avg=5127.04
l100.avg=5038.74, total.avg=5104.965
l100.avg=4995.38, total.avg=5083.048
l100.avg=4953.46, total.avg=5061.45
l100.avg=4913.22, total.avg=5040.274285714286
l100.avg=4870.66, total.avg=5019.0725
l100.avg=4829.04, total.avg=4997.957777777778
l100.avg=4789.42, total.avg=4977.104
l100.avg=4749.91, total.avg=4956.45
l100.avg=4699.48, total.avg=4935.035833333333
l100.avg=4653.65, total.avg=4913.390769230769
l100.avg=4611.87, total.avg=4891.853571428572
l100.avg=4570.98, total.avg=4870.462
l100.avg=4525.64, total.avg=4848.910625
l100.avg=4483.07, total.avg=4827.390588235294
l100.avg=4433.55, total.avg=4805.510555555556
l100.avg=4383.71, total.avg=4783.3105263157895
l100.avg=4341.55, total.avg=4761.2225
l100.avg=4297.74, total.avg=4739.151904761905
l100.avg=4253.98, total.avg=4717.098636363637
l100.avg=4209.51, total.avg=4695.029565217391
l100.avg=4167.2, total.avg=4673.036666666667
l100.avg=4126.78, total.avg=4651.1864
l100.avg=4087.32, total.avg=4629.499230769231
l100.avg=4047, total.avg=4607.925185185185
l100.avg=4006.58, total.avg=4586.448571428571
l100.avg=3965.88, total.avg=4565.049655172414
l100.avg=3923.28, total.avg=4543.657333333334
l100.avg=3882.04, total.avg=4522.314838709677
l100.avg=3842.24, total.avg=4501.0625
l100.avg=3802.22, total.avg=4479.885454545454
l100.avg=3761.91, total.avg=4458.768529411765
l100.avg=3722.74, total.avg=4437.739142857143
l100.avg=3681.31, total.avg=4416.727222222222
l100.avg=3638.19, total.avg=4395.685675675676
l100.avg=3591.33, total.avg=4374.518421052631
l100.avg=3530.22, total.avg=4352.869743589744
l100.avg=3488.72, total.avg=4331.266
l100.avg=3448.35, total.avg=4309.731463414634
l100.avg=3407.53, total.avg=4288.250476190477
l100.avg=3366.76, total.avg=4266.820465116279
l100.avg=3328.39, total.avg=4245.4925
l100.avg=3289.03, total.avg=4224.237777777777
l100.avg=3250.73, total.avg=4203.074565217391
l100.avg=3210.84, total.avg=4181.963191489362
l100.avg=3170.61, total.avg=4160.893333333333
l100.avg=3131.64, total.avg=4139.8881632653065
l100.avg=3092.85, total.avg=4118.9474
l100.avg=3054.78, total.avg=4098.08137254902
l100.avg=3014.82, total.avg=4077.249423076923
l100.avg=2975.9, total.avg=4056.469245283019
l100.avg=2938.16, total.avg=4035.759814814815
l100.avg=2899.26, total.avg=4015.096181818182
l100.avg=2861.27, total.avg=3994.492142857143
l100.avg=2822.02, total.avg=3973.9224561403507
l100.avg=2781.7, total.avg=3953.366896551724
l100.avg=2742.9, total.avg=3932.850508474576
l100.avg=2703.15, total.avg=3912.3555
l100.avg=2665.22, total.avg=3891.910655737705
l100.avg=2626.74, total.avg=3871.5046774193547
l100.avg=2587.41, total.avg=3851.1222222222223
l100.avg=2546.73, total.avg=3830.74109375
l100.avg=2506.86, total.avg=3810.373692307692
l100.avg=2467.18, total.avg=3790.0222727272726
l100.avg=2427.37, total.avg=3769.6841791044776
l100.avg=2387, total.avg=3749.3505882352943
l100.avg=2347.07, total.avg=3729.0276811594204
l100.avg=2309.39, total.avg=3708.747142857143
l100.avg=2271.2, total.avg=3688.5
l100.avg=2230.65, total.avg=3668.2520833333333
l100.avg=2192.71, total.avg=3648.039178082192
l100.avg=2153.06, total.avg=3627.8367567567566
l100.avg=2113.06, total.avg=3607.6397333333334
l100.avg=2071.82, total.avg=3587.4315789473685
l100.avg=2029.59, total.avg=3567.1998701298703
l100.avg=1988.42, total.avg=3546.9591025641025
l100.avg=1948.25, total.avg=3526.722278481013
l100.avg=1909.01, total.avg=3506.500875
l100.avg=1867.12, total.avg=3486.261604938272
l100.avg=1828.13, total.avg=3466.040487804878
l100.avg=1788.67, total.avg=3445.831204819277
l100.avg=1750.91, total.avg=3425.6535714285715
l100.avg=1711.39, total.avg=3405.4857647058825
l100.avg=1671.4, total.avg=3385.321976744186
l100.avg=1623.26, total.avg=3365.0683908045976
l100.avg=1558.99, total.avg=3344.5447727272726
l100.avg=1517.31, total.avg=3324.0140449438204
l100.avg=1476.3, total.avg=3303.483888888889
l100.avg=1437.61, total.avg=3282.9797802197804
l100.avg=1398.78, total.avg=3262.499347826087
l100.avg=1358.24, total.avg=3242.023440860215
l100.avg=1320.25, total.avg=3221.5790425531914
l100.avg=1280.76, total.avg=3201.1493684210527
l100.avg=1241.39, total.avg=3180.7352083333335
l100.avg=1200.26, total.avg=3160.3179381443297
l100.avg=1161.9, total.avg=3139.925918367347
l100.avg=1122.51, total.avg=3119.5479797979797
l100.avg=1077.71, total.avg=3099.1296

With true I get:

$ node gh-11380.js 
l100.avg=5174.52, total.avg=5174.52
l100.avg=5175.86, total.avg=5175.19
l100.avg=5127.96, total.avg=5159.446666666667
l100.avg=5078.36, total.avg=5139.175
l100.avg=5027.34, total.avg=5116.808
l100.avg=4985.49, total.avg=5094.921666666667
l100.avg=4946.37, total.avg=5073.7
l100.avg=4903.02, total.avg=5052.365
l100.avg=4862.76, total.avg=5031.297777777778
l100.avg=4820.84, total.avg=5010.252
l100.avg=4782.25, total.avg=4989.524545454546
l100.avg=4740.56, total.avg=4968.7775
l100.avg=4699.3, total.avg=4948.048461538461
l100.avg=4660.3, total.avg=4927.495
l100.avg=4619.62, total.avg=4906.97
l100.avg=4580.48, total.avg=4886.564375
l100.avg=4540.16, total.avg=4866.187647058823
l100.avg=4498.87, total.avg=4845.781111111111
l100.avg=4457.33, total.avg=4825.336315789474
l100.avg=4414.9, total.avg=4804.8145
l100.avg=4372.18, total.avg=4784.2128571428575
l100.avg=4318.4, total.avg=4763.039545454545
l100.avg=4277.86, total.avg=4741.944782608695
l100.avg=4235.52, total.avg=4720.84375
l100.avg=4194.64, total.avg=4699.7956
l100.avg=4155.33, total.avg=4678.8546153846155
l100.avg=4115.84, total.avg=4658.002222222222
l100.avg=4074.73, total.avg=4637.171071428572
l100.avg=4031.69, total.avg=4616.292413793103
l100.avg=3987.59, total.avg=4595.335666666667
l100.avg=3943.44, total.avg=4574.306774193548
l100.avg=3899.35, total.avg=4553.214375
l100.avg=3855.8, total.avg=4532.080606060606
l100.avg=3812.87, total.avg=4510.927352941177
l100.avg=3769.95, total.avg=4489.756571428571
l100.avg=3728.65, total.avg=4468.614722222223
l100.avg=3685.18, total.avg=4447.440810810811
l100.avg=3642.12, total.avg=4426.248157894737
l100.avg=3600.58, total.avg=4405.07717948718
l100.avg=3558.55, total.avg=4383.914
l100.avg=3516.72, total.avg=4362.7629268292685
l100.avg=3474.1, total.avg=4341.604285714286
l100.avg=3433.05, total.avg=4320.47511627907
l100.avg=3391.62, total.avg=4299.364772727273
l100.avg=3349.6, total.avg=4278.258888888889
l100.avg=3305.16, total.avg=4257.104565217392
l100.avg=3262.82, total.avg=4235.949574468085
l100.avg=3219.27, total.avg=4214.76875
l100.avg=3175.39, total.avg=4193.55693877551
l100.avg=3133.84, total.avg=4172.3626
l100.avg=3095.48, total.avg=4151.24725490196
l100.avg=3053.06, total.avg=4130.12826923077
l100.avg=3013.07, total.avg=4109.051698113208
l100.avg=2973.33, total.avg=4088.0198148148147
l100.avg=2933.26, total.avg=4067.0241818181817
l100.avg=2897.71, total.avg=4046.1435714285712
l100.avg=2857.42, total.avg=4025.2887719298246
l100.avg=2816, total.avg=4004.4389655172413
l100.avg=2774.52, total.avg=3983.592881355932
l100.avg=2732.95, total.avg=3962.7488333333336
l100.avg=2695.32, total.avg=3941.97131147541
l100.avg=2652.47, total.avg=3921.1729032258063
l100.avg=2613.34, total.avg=3900.413650793651
l100.avg=2573.62, total.avg=3879.6825
l100.avg=2531.11, total.avg=3858.9352307692307
l100.avg=2489.4, total.avg=3838.184696969697
l100.avg=2448.67, total.avg=3817.4456716417913
l100.avg=2406.45, total.avg=3796.6957352941176
l100.avg=2364.06, total.avg=3775.9328985507245
l100.avg=2323.89, total.avg=3755.1894285714284
l100.avg=2282.67, total.avg=3734.4497183098592
l100.avg=2241.5, total.avg=3713.7143055555557
l100.avg=2199.96, total.avg=3692.9779452054795
l100.avg=2160.99, total.avg=3672.2754054054053
l100.avg=2119.49, total.avg=3651.5716
l100.avg=2079.6, total.avg=3630.887763157895
l100.avg=2040.09, total.avg=3610.228051948052
l100.avg=1998.68, total.avg=3589.5671794871796
l100.avg=1958.95, total.avg=3568.9264556962025
l100.avg=1917.4, total.avg=3548.282375
l100.avg=1877.51, total.avg=3527.6555555555556
l100.avg=1837.52, total.avg=3507.0441463414636
l100.avg=1796.36, total.avg=3486.4334939759037
l100.avg=1754.92, total.avg=3465.820238095238
l100.avg=1714, total.avg=3445.210588235294
l100.avg=1672.57, total.avg=3424.598488372093
l100.avg=1629.32, total.avg=3403.963103448276
l100.avg=1587.34, total.avg=3383.319659090909
l100.avg=1546.05, total.avg=3362.676179775281
l100.avg=1506.66, total.avg=3342.0537777777777
l100.avg=1466.4, total.avg=3321.442197802198
l100.avg=1424.92, total.avg=3300.8278260869565
l100.avg=1384.5, total.avg=3280.222150537634
l100.avg=1343.02, total.avg=3259.6136170212767
l100.avg=1302, total.avg=3239.007157894737
l100.avg=1261.55, total.avg=3218.408645833333
l100.avg=1219.9, total.avg=3197.8054639175257
l100.avg=1179.36, total.avg=3177.209081632653
l100.avg=1138.14, total.avg=3156.6124242424244
l100.avg=1095.02, total.avg=3135.9965

So enableUtf8Validation: false is maybe 1% faster. It's not nothing, but there's more meaningful improvements we can make.

@vkarpov15 vkarpov15 removed this from the 6.3.7 milestone Jun 11, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
discussion If you have any thoughts or comments on this issue, please share them!
Projects
None yet
Development

No branches or pull requests

3 participants