{"version":"1.0.0","segments":[{"speaker":"SAMUEL DEGUELDRE","startTime":0.23,"endTime":2.51,"body":"Most performance problems happen on"},{"speaker":"SAMUEL DEGUELDRE","startTime":2.51,"endTime":5.45,"body":"And so if the client is slow, it's"},{"speaker":"SAMUEL DEGUELDRE","startTime":2.51,"endTime":5.45,"body":"because the server is responding"},{"speaker":"SAMUEL DEGUELDRE","startTime":5.45,"endTime":8.51,"body":"slowly. And at that point you don't"},{"speaker":"SAMUEL DEGUELDRE","startTime":5.45,"endTime":8.51,"body":"have a JavaScript performance problem."},{"speaker":"SAMUEL DEGUELDRE","startTime":9.71,"endTime":13.46,"body":"The life cycle on the Python side is"},{"speaker":"SAMUEL DEGUELDRE","startTime":9.71,"endTime":13.46,"body":"quite short, but on the JavaScript"},{"speaker":"SAMUEL DEGUELDRE","startTime":13.46,"endTime":17.6,"body":"side, people will often come first"},{"speaker":"SAMUEL DEGUELDRE","startTime":13.46,"endTime":17.6,"body":"thing in the day open up Odoo, and"},{"speaker":"SAMUEL DEGUELDRE","startTime":17.6,"endTime":18.65,"body":"they leave it open all day."},{"speaker":"SAMUEL DEGUELDRE","startTime":18.65,"endTime":22.73,"body":"And so we have to be more conscious"},{"speaker":"SAMUEL DEGUELDRE","startTime":18.65,"endTime":22.73,"body":"of memory than we we have to be on the"},{"speaker":"SAMUEL DEGUELDRE","startTime":22.73,"endTime":26.75,"body":"Python side. There are hard leaks,"},{"speaker":"SAMUEL DEGUELDRE","startTime":22.73,"endTime":26.75,"body":"but hard leaks are runtime bugs."},{"speaker":"SAMUEL DEGUELDRE","startTime":26.75,"endTime":29.21,"body":"It's a bug in Chrome itself, and it"},{"speaker":"SAMUEL DEGUELDRE","startTime":26.75,"endTime":29.21,"body":"can happen."},{"speaker":"SAMUEL DEGUELDRE","startTime":29.21,"endTime":32.39,"body":"But it's I don't think I've ever"},{"speaker":"SAMUEL DEGUELDRE","startTime":29.21,"endTime":32.39,"body":"found one."},{"speaker":"SAMUEL DEGUELDRE","startTime":33.17,"endTime":36.89,"body":"Basically, all the things that you"},{"speaker":"SAMUEL DEGUELDRE","startTime":33.17,"endTime":36.89,"body":"should see in the memory snapshot are"},{"speaker":"SAMUEL DEGUELDRE","startTime":36.89,"endTime":40.43,"body":"Chrome internals like compiled code,"},{"speaker":"SAMUEL DEGUELDRE","startTime":36.89,"endTime":40.43,"body":"interned strings, that sort of stuff."},{"speaker":"SAMUEL DEGUELDRE","startTime":40.43,"endTime":44.27,"body":"This is nothing to worry about, but"},{"speaker":"SAMUEL DEGUELDRE","startTime":40.43,"endTime":44.27,"body":"if you see objects or components or"},{"speaker":"SAMUEL DEGUELDRE","startTime":44.27,"endTime":47.39,"body":"Dom elements, this is when you know"},{"speaker":"SAMUEL DEGUELDRE","startTime":44.27,"endTime":47.39,"body":"you've got a memory leak."},{"speaker":"SAMUEL DEGUELDRE","startTime":47.39,"endTime":50.18,"body":"It's not black magic like most things"},{"speaker":"SAMUEL DEGUELDRE","startTime":47.39,"endTime":50.18,"body":"in software."},{"speaker":"SAMUEL DEGUELDRE","startTime":50.18,"endTime":53.96,"body":"You just have to be interested, do"},{"speaker":"SAMUEL DEGUELDRE","startTime":50.18,"endTime":53.96,"body":"some research, and then just do it a"},{"speaker":"SAMUEL DEGUELDRE","startTime":53.96,"endTime":56.12,"body":"lot. You do it a lot and then you get"},{"speaker":"SAMUEL DEGUELDRE","startTime":53.96,"endTime":56.12,"body":"good."},{"speaker":"SAMUEL DEGUELDRE","startTime":56.54,"endTime":60.02,"body":"Uh, most of the tools are pretty"},{"speaker":"SAMUEL DEGUELDRE","startTime":56.54,"endTime":60.02,"body":"intuitive, like especially all of the"},{"speaker":"SAMUEL DEGUELDRE","startTime":60.02,"endTime":63.14,"body":"Chrome dev tools. They're not super"},{"speaker":"SAMUEL DEGUELDRE","startTime":60.02,"endTime":63.14,"body":"well documented, but most of the"},{"speaker":"SAMUEL DEGUELDRE","startTime":63.14,"endTime":65.6,"body":"things are kind of self-explanatory."},{"speaker":"SAMUEL DEGUELDRE","startTime":65.6,"endTime":69.44,"body":"It's just that you have to to, like,"},{"speaker":"SAMUEL DEGUELDRE","startTime":65.6,"endTime":69.44,"body":"play around in the UI to find all of"},{"speaker":"SAMUEL DEGUELDRE","startTime":69.44,"endTime":73.01,"body":"the options. But once you found them,"},{"speaker":"SAMUEL DEGUELDRE","startTime":69.44,"endTime":73.01,"body":"uh, you're pretty much golden."},{"speaker":"OLIVIER COLSON","startTime":73.46,"endTime":76.94,"body":"Hi, everyone, and welcome to this new"},{"speaker":"OLIVIER COLSON","startTime":76.97,"endTime":81.41,"body":"Today I have the pleasure to discuss"},{"speaker":"OLIVIER COLSON","startTime":76.97,"endTime":81.41,"body":"an always trending topic JavaScript,"},{"speaker":"OLIVIER COLSON","startTime":81.41,"endTime":84.26,"body":"with my guest, Samuel Degueldre,"},{"speaker":"OLIVIER COLSON","startTime":81.41,"endTime":84.26,"body":"developer at Odoo."},{"speaker":"OLIVIER COLSON","startTime":84.29,"endTime":87.17,"body":"We'll go through various subjects,"},{"speaker":"OLIVIER COLSON","startTime":84.29,"endTime":87.17,"body":"including Owl, performance"},{"speaker":"OLIVIER COLSON","startTime":87.17,"endTime":91.43,"body":"optimization, and many more, so make"},{"speaker":"OLIVIER COLSON","startTime":87.17,"endTime":91.43,"body":"sure to stay until the end because you"},{"speaker":"OLIVIER COLSON","startTime":91.43,"endTime":92.87,"body":"might learn a lot of things."},{"speaker":"OLIVIER COLSON","startTime":92.87,"endTime":94.52,"body":"Ready? Let's go."},{"speaker":"OLIVIER COLSON","startTime":95.45,"endTime":96.29,"body":"Hi, Sam."},{"speaker":"SAMUEL DEGUELDRE","startTime":96.29,"endTime":96.89,"body":"Hi, Olivier."},{"speaker":"OLIVIER COLSON","startTime":96.89,"endTime":101.45,"body":"So it's not your first time with with"},{"speaker":"OLIVIER COLSON","startTime":101.45,"endTime":103.43,"body":"all that. You were in the first"},{"speaker":"OLIVIER COLSON","startTime":101.45,"endTime":103.43,"body":"episode of Odoo unplugged."},{"speaker":"OLIVIER COLSON","startTime":103.43,"endTime":104.6,"body":"But it's the first in the podcast,"},{"speaker":"OLIVIER COLSON","startTime":103.43,"endTime":104.6,"body":"right?"},{"speaker":"SAMUEL DEGUELDRE","startTime":104.96,"endTime":105.41,"body":"Yeah."},{"speaker":"OLIVIER COLSON","startTime":105.41,"endTime":106.37,"body":"Welcome."},{"speaker":"SAMUEL DEGUELDRE","startTime":106.37,"endTime":107.24,"body":"Thank you."},{"speaker":"OLIVIER COLSON","startTime":107.81,"endTime":109.4,"body":"So, what are we going to talk about"},{"speaker":"SAMUEL DEGUELDRE","startTime":110.66,"endTime":114.53,"body":"Um, well, I'm told I've been invited"},{"speaker":"SAMUEL DEGUELDRE","startTime":114.53,"endTime":115.82,"body":"so probably that."},{"speaker":"OLIVIER COLSON","startTime":116.15,"endTime":117.53,"body":"Yeah, I don't have any surprise."},{"speaker":"OLIVIER COLSON","startTime":117.53,"endTime":118.55,"body":"We don't change the subject like"},{"speaker":"OLIVIER COLSON","startTime":117.53,"endTime":118.55,"body":"that."},{"speaker":"OLIVIER COLSON","startTime":118.67,"endTime":120.29,"body":"Come on. Uh, yeah."},{"speaker":"OLIVIER COLSON","startTime":120.29,"endTime":121.4,"body":"I cannot do that."},{"speaker":"OLIVIER COLSON","startTime":121.4,"endTime":125.54,"body":"Uh, maybe first introduce yourself a"},{"speaker":"OLIVIER COLSON","startTime":121.4,"endTime":125.54,"body":"little bit for people not remembering"},{"speaker":"OLIVIER COLSON","startTime":125.54,"endTime":126.83,"body":"you from, uh, unplugged."},{"speaker":"SAMUEL DEGUELDRE","startTime":126.83,"endTime":130.49,"body":"Yeah. And also people who didn't watch"},{"speaker":"OLIVIER COLSON","startTime":130.52,"endTime":131.51,"body":"Come on, everybody watched it."},{"speaker":"SAMUEL DEGUELDRE","startTime":132.71,"endTime":136.34,"body":"I mean, I'd like to think that I'm a"},{"speaker":"SAMUEL DEGUELDRE","startTime":136.34,"endTime":137.18,"body":"the case just yet."},{"speaker":"OLIVIER COLSON","startTime":137.18,"endTime":141.14,"body":"Not yet. But after this episode, you"},{"speaker":"SAMUEL DEGUELDRE","startTime":141.14,"endTime":146.57,"body":"So I'm Sam, I've been working at Odoo"},{"speaker":"SAMUEL DEGUELDRE","startTime":146.57,"endTime":147.92,"body":"part of the JavaScript framework"},{"speaker":"SAMUEL DEGUELDRE","startTime":146.57,"endTime":147.92,"body":"team."},{"speaker":"SAMUEL DEGUELDRE","startTime":148.1,"endTime":151.79,"body":"So the team that, uh, writes and"},{"speaker":"SAMUEL DEGUELDRE","startTime":148.1,"endTime":151.79,"body":"maintains all of the, the framework"},{"speaker":"SAMUEL DEGUELDRE","startTime":151.79,"endTime":157.76,"body":"that we have for the client side, um,"},{"speaker":"SAMUEL DEGUELDRE","startTime":151.79,"endTime":157.76,"body":"and I'm one of the people on this team"},{"speaker":"SAMUEL DEGUELDRE","startTime":157.76,"endTime":160.22,"body":"that specializes in performance."},{"speaker":"SAMUEL DEGUELDRE","startTime":160.22,"endTime":165.05,"body":"And so whenever we find performance"},{"speaker":"SAMUEL DEGUELDRE","startTime":160.22,"endTime":165.05,"body":"issues in the framework or in"},{"speaker":"SAMUEL DEGUELDRE","startTime":165.05,"endTime":170.18,"body":"JavaScript in general, um, I'm kind"},{"speaker":"SAMUEL DEGUELDRE","startTime":165.05,"endTime":170.18,"body":"of the go-to person to investigate t"},{"speaker":"SAMUEL DEGUELDRE","startTime":170.18,"endTime":174.71,"body":"hese issues or help people when"},{"speaker":"SAMUEL DEGUELDRE","startTime":170.18,"endTime":174.71,"body":"they're making new developments and"},{"speaker":"SAMUEL DEGUELDRE","startTime":174.71,"endTime":177.08,"body":"the performance just isn't quite up"},{"speaker":"SAMUEL DEGUELDRE","startTime":174.71,"endTime":177.08,"body":"to snuff."},{"speaker":"SAMUEL DEGUELDRE","startTime":177.38,"endTime":180.02,"body":"Um, I can come in and help them."},{"speaker":"SAMUEL DEGUELDRE","startTime":180.02,"endTime":181.19,"body":"And so, yeah."},{"speaker":"OLIVIER COLSON","startTime":181.49,"endTime":183.5,"body":"How did you end up being that person?"},{"speaker":"OLIVIER COLSON","startTime":183.5,"endTime":185.81,"body":"You have a specific background or not"},{"speaker":"OLIVIER COLSON","startTime":183.5,"endTime":185.81,"body":"really?"},{"speaker":"SAMUEL DEGUELDRE","startTime":186.11,"endTime":191.27,"body":"So kind of, uh, just being interested"},{"speaker":"SAMUEL DEGUELDRE","startTime":191.27,"endTime":193.52,"body":"around with the tools that exist."},{"speaker":"SAMUEL DEGUELDRE","startTime":193.85,"endTime":198.44,"body":"Um, at some point, I developed the"},{"speaker":"SAMUEL DEGUELDRE","startTime":193.85,"endTime":198.44,"body":"skill set, and it's kind of like the"},{"speaker":"SAMUEL DEGUELDRE","startTime":198.44,"endTime":199.7,"body":"ball gets rolling, right?"},{"speaker":"SAMUEL DEGUELDRE","startTime":199.7,"endTime":202.49,"body":"Once, you know, a little bit of this"},{"speaker":"SAMUEL DEGUELDRE","startTime":199.7,"endTime":202.49,"body":"stuff, people can come to you with"},{"speaker":"SAMUEL DEGUELDRE","startTime":202.49,"endTime":206.21,"body":"their issues. And so you learn more"},{"speaker":"SAMUEL DEGUELDRE","startTime":202.49,"endTime":206.21,"body":"and then, uh, now I'm here."},{"speaker":"OLIVIER COLSON","startTime":206.24,"endTime":209.96,"body":"Um, and how often does it happen that"},{"speaker":"OLIVIER COLSON","startTime":209.96,"endTime":212.0,"body":"to solve in really the JavaScript"},{"speaker":"OLIVIER COLSON","startTime":209.96,"endTime":212.0,"body":"side?"},{"speaker":"OLIVIER COLSON","startTime":212.45,"endTime":216.53,"body":"Uh, because we often talk about the"},{"speaker":"OLIVIER COLSON","startTime":212.45,"endTime":216.53,"body":"performance of the server, of the SQL"},{"speaker":"OLIVIER COLSON","startTime":216.53,"endTime":218.63,"body":"queries, whatever the volume of data."},{"speaker":"OLIVIER COLSON","startTime":218.63,"endTime":221.39,"body":"But how often does it happen in the"},{"speaker":"OLIVIER COLSON","startTime":218.63,"endTime":221.39,"body":"browser itself?"},{"speaker":"SAMUEL DEGUELDRE","startTime":221.39,"endTime":224.87,"body":"So first of all, you always have to be"},{"speaker":"SAMUEL DEGUELDRE","startTime":224.87,"endTime":226.01,"body":"You can't just write code."},{"speaker":"SAMUEL DEGUELDRE","startTime":226.01,"endTime":230.57,"body":"And then when it's really, really"},{"speaker":"SAMUEL DEGUELDRE","startTime":226.01,"endTime":230.57,"body":"slow, uh, just throw up your arms in"},{"speaker":"SAMUEL DEGUELDRE","startTime":230.57,"endTime":233.66,"body":"the air and say, well, I never could"},{"speaker":"SAMUEL DEGUELDRE","startTime":230.57,"endTime":233.66,"body":"have seen this coming."},{"speaker":"SAMUEL DEGUELDRE","startTime":233.66,"endTime":236.99,"body":"So, uh, like, being performance"},{"speaker":"SAMUEL DEGUELDRE","startTime":233.66,"endTime":236.99,"body":"conscious is something that happens"},{"speaker":"SAMUEL DEGUELDRE","startTime":236.99,"endTime":240.65,"body":"all the time, but, uh, like actual"},{"speaker":"SAMUEL DEGUELDRE","startTime":236.99,"endTime":240.65,"body":"performance problems that happen in"},{"speaker":"SAMUEL DEGUELDRE","startTime":240.65,"endTime":245.0,"body":"production that make the application"},{"speaker":"SAMUEL DEGUELDRE","startTime":240.65,"endTime":245.0,"body":"difficult to use or maybe even"},{"speaker":"SAMUEL DEGUELDRE","startTime":245.0,"endTime":246.89,"body":"unusable. They're quite rare."},{"speaker":"SAMUEL DEGUELDRE","startTime":247.19,"endTime":252.02,"body":"Um, and then when we find them, uh,"},{"speaker":"SAMUEL DEGUELDRE","startTime":247.19,"endTime":252.02,"body":"well, when we find the issues, uh, it"},{"speaker":"SAMUEL DEGUELDRE","startTime":252.02,"endTime":255.47,"body":"identifying the root cause and then"},{"speaker":"SAMUEL DEGUELDRE","startTime":252.02,"endTime":255.47,"body":"fixing it is generally not that"},{"speaker":"SAMUEL DEGUELDRE","startTime":255.47,"endTime":258.89,"body":"difficult. So it's not something"},{"speaker":"SAMUEL DEGUELDRE","startTime":255.47,"endTime":258.89,"body":"that's ever-present."},{"speaker":"SAMUEL DEGUELDRE","startTime":258.89,"endTime":263.21,"body":"Uh, although I have to say, um, since"},{"speaker":"SAMUEL DEGUELDRE","startTime":258.89,"endTime":263.21,"body":"Odoo has been growing a lot and we, we"},{"speaker":"SAMUEL DEGUELDRE","startTime":263.21,"endTime":266.78,"body":"have been recruiting more and more"},{"speaker":"SAMUEL DEGUELDRE","startTime":263.21,"endTime":266.78,"body":"developers, and also as we've"},{"speaker":"SAMUEL DEGUELDRE","startTime":266.78,"endTime":272.54,"body":"increased the functional coverage in"},{"speaker":"SAMUEL DEGUELDRE","startTime":266.78,"endTime":272.54,"body":"like the, the width of the functional"},{"speaker":"SAMUEL DEGUELDRE","startTime":272.54,"endTime":276.35,"body":"coverage has kind of, uh, stopped"},{"speaker":"SAMUEL DEGUELDRE","startTime":272.54,"endTime":276.35,"body":"growing outwards."},{"speaker":"SAMUEL DEGUELDRE","startTime":276.35,"endTime":277.76,"body":"And so now we're going in depth."},{"speaker":"SAMUEL DEGUELDRE","startTime":277.76,"endTime":282.32,"body":"And when you want to go in-depth, uh,"},{"speaker":"SAMUEL DEGUELDRE","startTime":277.76,"endTime":282.32,"body":"one of the big things is user"},{"speaker":"SAMUEL DEGUELDRE","startTime":282.32,"endTime":286.49,"body":"experience. And to have a great user"},{"speaker":"SAMUEL DEGUELDRE","startTime":282.32,"endTime":286.49,"body":"experience you tend to write more"},{"speaker":"SAMUEL DEGUELDRE","startTime":286.49,"endTime":290.66,"body":"JavaScript. And so we're finding more"},{"speaker":"SAMUEL DEGUELDRE","startTime":286.49,"endTime":290.66,"body":"issues with JavaScript code just"},{"speaker":"SAMUEL DEGUELDRE","startTime":290.66,"endTime":292.22,"body":"because we're writing more JavaScript"},{"speaker":"SAMUEL DEGUELDRE","startTime":290.66,"endTime":292.22,"body":"recently."},{"speaker":"OLIVIER COLSON","startTime":292.67,"endTime":297.02,"body":"Also just for, you know, more"},{"speaker":"OLIVIER COLSON","startTime":297.02,"endTime":301.62,"body":"Yesterday I wrote an old widget for a"},{"speaker":"OLIVIER COLSON","startTime":297.02,"endTime":301.62,"body":"field for something coming in, in"},{"speaker":"OLIVIER COLSON","startTime":301.62,"endTime":305.01,"body":"accounting, and yeah, I had to write"},{"speaker":"OLIVIER COLSON","startTime":301.62,"endTime":305.01,"body":"it."},{"speaker":"OLIVIER COLSON","startTime":305.37,"endTime":310.17,"body":"And a few years ago, it was never"},{"speaker":"OLIVIER COLSON","startTime":305.37,"endTime":310.17,"body":"like that because we never focused on"},{"speaker":"OLIVIER COLSON","startTime":310.17,"endTime":311.97,"body":"more detailed stuff like that."},{"speaker":"OLIVIER COLSON","startTime":311.97,"endTime":315.27,"body":"And now we've reached a maturity and"},{"speaker":"OLIVIER COLSON","startTime":311.97,"endTime":315.27,"body":"the size of the company where it's"},{"speaker":"OLIVIER COLSON","startTime":315.27,"endTime":316.8,"body":"possible to allocate resources for"},{"speaker":"OLIVIER COLSON","startTime":315.27,"endTime":316.8,"body":"that."},{"speaker":"OLIVIER COLSON","startTime":317.34,"endTime":321.9,"body":"And so indeed, uh, maybe I did"},{"speaker":"OLIVIER COLSON","startTime":317.34,"endTime":321.9,"body":"complete shit and I will need your"},{"speaker":"OLIVIER COLSON","startTime":321.9,"endTime":323.07,"body":"help at some point. Who knows?"},{"speaker":"SAMUEL DEGUELDRE","startTime":324.15,"endTime":327.57,"body":"So hopefully, we've written the"},{"speaker":"SAMUEL DEGUELDRE","startTime":327.57,"endTime":329.1,"body":"to worry too much about performance."},{"speaker":"SAMUEL DEGUELDRE","startTime":329.1,"endTime":332.94,"body":"Generally, like the main extension"},{"speaker":"SAMUEL DEGUELDRE","startTime":329.1,"endTime":332.94,"body":"points are places where it's kind of"},{"speaker":"SAMUEL DEGUELDRE","startTime":332.94,"endTime":336.87,"body":"hard to mess it up right when you're"},{"speaker":"SAMUEL DEGUELDRE","startTime":332.94,"endTime":336.87,"body":"registering a field."},{"speaker":"SAMUEL DEGUELDRE","startTime":336.87,"endTime":342.51,"body":"The big performance concern around,"},{"speaker":"SAMUEL DEGUELDRE","startTime":336.87,"endTime":342.51,"body":"uh, fields specifically is data"},{"speaker":"SAMUEL DEGUELDRE","startTime":342.51,"endTime":345.93,"body":"fetching, and hopefully, data"},{"speaker":"SAMUEL DEGUELDRE","startTime":342.51,"endTime":345.93,"body":"fetching should be all handled by the"},{"speaker":"SAMUEL DEGUELDRE","startTime":345.93,"endTime":349.95,"body":"framework, which means that you don't"},{"speaker":"SAMUEL DEGUELDRE","startTime":345.93,"endTime":349.95,"body":"have issues where you have a request."},{"speaker":"SAMUEL DEGUELDRE","startTime":349.95,"endTime":354.09,"body":"And then after that request comes"},{"speaker":"SAMUEL DEGUELDRE","startTime":349.95,"endTime":354.09,"body":"back, you fire off another request"},{"speaker":"SAMUEL DEGUELDRE","startTime":354.09,"endTime":358.26,"body":"where you have sequential data"},{"speaker":"SAMUEL DEGUELDRE","startTime":354.09,"endTime":358.26,"body":"dependency that causes stuff to load"},{"speaker":"SAMUEL DEGUELDRE","startTime":358.26,"endTime":361.11,"body":"for a while because you have to talk"},{"speaker":"SAMUEL DEGUELDRE","startTime":358.26,"endTime":361.11,"body":"to the server back and forth many,"},{"speaker":"SAMUEL DEGUELDRE","startTime":361.11,"endTime":365.28,"body":"many times. Uh, generally, this is"},{"speaker":"SAMUEL DEGUELDRE","startTime":361.11,"endTime":365.28,"body":"just handled by the framework."},{"speaker":"SAMUEL DEGUELDRE","startTime":365.28,"endTime":368.55,"body":"And so you don't really have to worry"},{"speaker":"SAMUEL DEGUELDRE","startTime":365.28,"endTime":368.55,"body":"about it."},{"speaker":"OLIVIER COLSON","startTime":368.55,"endTime":374.19,"body":"So often the amount of data that you"},{"speaker":"OLIVIER COLSON","startTime":374.19,"endTime":378.36,"body":"be small enough that you don't have"},{"speaker":"OLIVIER COLSON","startTime":374.19,"endTime":378.36,"body":"big issues performance-wise."},{"speaker":"OLIVIER COLSON","startTime":378.57,"endTime":380.13,"body":"If I get it, unless you do tons of"},{"speaker":"OLIVIER COLSON","startTime":378.57,"endTime":380.13,"body":"queries."},{"speaker":"SAMUEL DEGUELDRE","startTime":380.67,"endTime":385.14,"body":"Yeah. So and this is something that"},{"speaker":"SAMUEL DEGUELDRE","startTime":385.14,"endTime":388.71,"body":"reasons where most people don't have"},{"speaker":"SAMUEL DEGUELDRE","startTime":385.14,"endTime":388.71,"body":"to worry about JavaScript performance"},{"speaker":"SAMUEL DEGUELDRE","startTime":388.71,"endTime":393.66,"body":"too much is that generally, uh, in on"},{"speaker":"SAMUEL DEGUELDRE","startTime":388.71,"endTime":393.66,"body":"the server, if you need to run an"},{"speaker":"SAMUEL DEGUELDRE","startTime":393.66,"endTime":398.31,"body":"aggregate query and, I don't know,"},{"speaker":"SAMUEL DEGUELDRE","startTime":393.66,"endTime":398.31,"body":"find the the average price of, uh, a"},{"speaker":"SAMUEL DEGUELDRE","startTime":398.31,"endTime":400.53,"body":"transaction over, I don't know, two"},{"speaker":"SAMUEL DEGUELDRE","startTime":398.31,"endTime":400.53,"body":"years."},{"speaker":"SAMUEL DEGUELDRE","startTime":400.83,"endTime":402.75,"body":"You have lots and lots of data to come"},{"speaker":"SAMUEL DEGUELDRE","startTime":400.83,"endTime":402.75,"body":"through."},{"speaker":"SAMUEL DEGUELDRE","startTime":403.11,"endTime":404.58,"body":"And so it takes a lot of time."},{"speaker":"SAMUEL DEGUELDRE","startTime":404.58,"endTime":407.76,"body":"But on the client side we have two"},{"speaker":"SAMUEL DEGUELDRE","startTime":404.58,"endTime":407.76,"body":"advantages."},{"speaker":"SAMUEL DEGUELDRE","startTime":408.51,"endTime":411.57,"body":"One is, well most of the work should"},{"speaker":"SAMUEL DEGUELDRE","startTime":408.51,"endTime":411.57,"body":"be done on the server anyway."},{"speaker":"SAMUEL DEGUELDRE","startTime":411.57,"endTime":414.99,"body":"And so if there's a performance"},{"speaker":"SAMUEL DEGUELDRE","startTime":411.57,"endTime":414.99,"body":"problem, it probably happened before"},{"speaker":"SAMUEL DEGUELDRE","startTime":414.99,"endTime":416.28,"body":"the data ever reached the client."},{"speaker":"SAMUEL DEGUELDRE","startTime":416.28,"endTime":421.08,"body":"And the other is that you can only"},{"speaker":"SAMUEL DEGUELDRE","startTime":416.28,"endTime":421.08,"body":"ever display so much data on one"},{"speaker":"SAMUEL DEGUELDRE","startTime":421.08,"endTime":422.37,"body":"screen. And so."},{"speaker":"SAMUEL DEGUELDRE","startTime":423.08,"endTime":428.81,"body":"Even like one of the easiest"},{"speaker":"SAMUEL DEGUELDRE","startTime":423.08,"endTime":428.81,"body":"strategies is to just not fetch too"},{"speaker":"SAMUEL DEGUELDRE","startTime":428.81,"endTime":430.94,"body":"much data. And this is typically what"},{"speaker":"SAMUEL DEGUELDRE","startTime":428.81,"endTime":430.94,"body":"we do."},{"speaker":"SAMUEL DEGUELDRE","startTime":430.94,"endTime":434.54,"body":"For example, in the list view, we"},{"speaker":"SAMUEL DEGUELDRE","startTime":430.94,"endTime":434.54,"body":"only show the first 80 records because"},{"speaker":"SAMUEL DEGUELDRE","startTime":434.54,"endTime":438.71,"body":"it's completely useless to load a"},{"speaker":"SAMUEL DEGUELDRE","startTime":434.54,"endTime":438.71,"body":"thousand records if the user is never"},{"speaker":"SAMUEL DEGUELDRE","startTime":438.71,"endTime":439.82,"body":"going to be looking at them."},{"speaker":"SAMUEL DEGUELDRE","startTime":439.82,"endTime":444.44,"body":"And so we just have a page, and you"},{"speaker":"SAMUEL DEGUELDRE","startTime":439.82,"endTime":444.44,"body":"can go to the next page and show like"},{"speaker":"SAMUEL DEGUELDRE","startTime":444.44,"endTime":445.64,"body":"80 records at a time."},{"speaker":"SAMUEL DEGUELDRE","startTime":445.64,"endTime":447.02,"body":"And it's still customizable."},{"speaker":"SAMUEL DEGUELDRE","startTime":447.02,"endTime":451.1,"body":"And so we still have to worry that"},{"speaker":"SAMUEL DEGUELDRE","startTime":447.02,"endTime":451.1,"body":"the performance is good even when you"},{"speaker":"SAMUEL DEGUELDRE","startTime":451.1,"endTime":454.7,"body":"load a lot more records. But the"},{"speaker":"SAMUEL DEGUELDRE","startTime":451.1,"endTime":454.7,"body":"default case doesn't really need to"},{"speaker":"SAMUEL DEGUELDRE","startTime":454.7,"endTime":455.54,"body":"worry too much."},{"speaker":"OLIVIER COLSON","startTime":455.84,"endTime":458.93,"body":"And you, anyway, don't load them all"},{"speaker":"OLIVIER COLSON","startTime":458.93,"endTime":463.01,"body":"sense. It would be unusable. You will"},{"speaker":"OLIVIER COLSON","startTime":458.93,"endTime":463.01,"body":"never display 10,000 records in one"},{"speaker":"OLIVIER COLSON","startTime":463.01,"endTime":465.14,"body":"view, and expect the user to find"},{"speaker":"OLIVIER COLSON","startTime":463.01,"endTime":465.14,"body":"that user-friendly."},{"speaker":"OLIVIER COLSON","startTime":465.14,"endTime":465.44,"body":"It's."},{"speaker":"SAMUEL DEGUELDRE","startTime":465.44,"endTime":468.59,"body":"Yeah, exactly. At that point, like you"},{"speaker":"SAMUEL DEGUELDRE","startTime":468.59,"endTime":472.73,"body":"experience anyway. So this is why you"},{"speaker":"SAMUEL DEGUELDRE","startTime":468.59,"endTime":472.73,"body":"have pages, and this is also why you"},{"speaker":"SAMUEL DEGUELDRE","startTime":472.73,"endTime":475.4,"body":"have searching that sort of stuff."},{"speaker":"SAMUEL DEGUELDRE","startTime":475.52,"endTime":479.24,"body":"We don't expect users to just scroll"},{"speaker":"SAMUEL DEGUELDRE","startTime":475.52,"endTime":479.24,"body":"their records until they find what"},{"speaker":"SAMUEL DEGUELDRE","startTime":479.24,"endTime":480.29,"body":"they want. They use the search."},{"speaker":"SAMUEL DEGUELDRE","startTime":480.29,"endTime":485.54,"body":"And so mostly, uh, the fact that we"},{"speaker":"SAMUEL DEGUELDRE","startTime":480.29,"endTime":485.54,"body":"even display many records at all is"},{"speaker":"SAMUEL DEGUELDRE","startTime":485.6,"endTime":487.1,"body":"the latest records are generally"},{"speaker":"SAMUEL DEGUELDRE","startTime":485.6,"endTime":487.1,"body":"useful."},{"speaker":"SAMUEL DEGUELDRE","startTime":487.55,"endTime":493.58,"body":"And then, uh, sometimes you, you, uh,"},{"speaker":"SAMUEL DEGUELDRE","startTime":487.55,"endTime":493.58,"body":"write a search query, and you expect"},{"speaker":"SAMUEL DEGUELDRE","startTime":493.58,"endTime":496.52,"body":"multiple records to be returned and"},{"speaker":"SAMUEL DEGUELDRE","startTime":493.58,"endTime":496.52,"body":"then, but you don't expect like,"},{"speaker":"SAMUEL DEGUELDRE","startTime":496.52,"endTime":498.02,"body":"hundreds of records generally."},{"speaker":"OLIVIER COLSON","startTime":498.8,"endTime":503.33,"body":"Okay. What would be the typical"},{"speaker":"OLIVIER COLSON","startTime":503.33,"endTime":507.35,"body":"So there is something working badly"},{"speaker":"OLIVIER COLSON","startTime":503.33,"endTime":507.35,"body":"in some JavaScript code."},{"speaker":"OLIVIER COLSON","startTime":507.35,"endTime":508.76,"body":"What is it typically?"},{"speaker":"SAMUEL DEGUELDRE","startTime":508.76,"endTime":513.63,"body":"So. The typical like performance"},{"speaker":"SAMUEL DEGUELDRE","startTime":513.63,"endTime":515.73,"body":"Things that run too slow are not very"},{"speaker":"SAMUEL DEGUELDRE","startTime":513.63,"endTime":515.73,"body":"different."},{"speaker":"SAMUEL DEGUELDRE","startTime":516.66,"endTime":520.35,"body":"Uh, on the client side, as on the"},{"speaker":"SAMUEL DEGUELDRE","startTime":516.66,"endTime":520.35,"body":"server side, obviously we don't have"},{"speaker":"SAMUEL DEGUELDRE","startTime":520.35,"endTime":524.67,"body":"to worry about querying the database"},{"speaker":"SAMUEL DEGUELDRE","startTime":520.35,"endTime":524.67,"body":"and stuff, but sometimes, uh, like the"},{"speaker":"SAMUEL DEGUELDRE","startTime":524.85,"endTime":527.22,"body":"most performance problems happen on"},{"speaker":"SAMUEL DEGUELDRE","startTime":524.85,"endTime":527.22,"body":"the server."},{"speaker":"SAMUEL DEGUELDRE","startTime":527.22,"endTime":530.85,"body":"And so if the client is slow, it's"},{"speaker":"SAMUEL DEGUELDRE","startTime":527.22,"endTime":530.85,"body":"because the server is responding"},{"speaker":"SAMUEL DEGUELDRE","startTime":530.85,"endTime":534.0,"body":"slowly. And at that point, you don't"},{"speaker":"SAMUEL DEGUELDRE","startTime":530.85,"endTime":534.0,"body":"have JavaScript performance problems."},{"speaker":"SAMUEL DEGUELDRE","startTime":534.18,"endTime":537.3,"body":"But when you do have problems,"},{"speaker":"SAMUEL DEGUELDRE","startTime":534.18,"endTime":537.3,"body":"they're generally the same kind of"},{"speaker":"SAMUEL DEGUELDRE","startTime":537.3,"endTime":538.32,"body":"dumb mistakes."},{"speaker":"SAMUEL DEGUELDRE","startTime":538.32,"endTime":543.72,"body":"Like most of the issues that we find"},{"speaker":"SAMUEL DEGUELDRE","startTime":538.32,"endTime":543.72,"body":"when someone, uh, reports that, uh,"},{"speaker":"SAMUEL DEGUELDRE","startTime":543.72,"endTime":548.64,"body":"the application is behaving, uh,"},{"speaker":"SAMUEL DEGUELDRE","startTime":543.72,"endTime":548.64,"body":"slowly, uh, or things take a while to"},{"speaker":"SAMUEL DEGUELDRE","startTime":548.64,"endTime":550.02,"body":"display that sort of stuff."},{"speaker":"SAMUEL DEGUELDRE","startTime":550.02,"endTime":555.39,"body":"It's, it's just a dumb loop in a loop"},{"speaker":"SAMUEL DEGUELDRE","startTime":550.02,"endTime":555.39,"body":"where you have some behavior that's n"},{"speaker":"SAMUEL DEGUELDRE","startTime":555.39,"endTime":559.44,"body":"squared. And sometimes, it's a little"},{"speaker":"SAMUEL DEGUELDRE","startTime":555.39,"endTime":559.44,"body":"less obvious because you have a loop."},{"speaker":"SAMUEL DEGUELDRE","startTime":559.44,"endTime":563.34,"body":"And inside of this loop, you call an"},{"speaker":"SAMUEL DEGUELDRE","startTime":559.44,"endTime":563.34,"body":"array method that iterates over the"},{"speaker":"SAMUEL DEGUELDRE","startTime":563.34,"endTime":564.6,"body":"array. But basically, it's the same"},{"speaker":"SAMUEL DEGUELDRE","startTime":563.34,"endTime":564.6,"body":"issue."},{"speaker":"SAMUEL DEGUELDRE","startTime":564.81,"endTime":567.9,"body":"So most issues are just really dumb."},{"speaker":"SAMUEL DEGUELDRE","startTime":567.9,"endTime":571.17,"body":"I don't think I've ever found a"},{"speaker":"SAMUEL DEGUELDRE","startTime":567.9,"endTime":571.17,"body":"performance problem."},{"speaker":"SAMUEL DEGUELDRE","startTime":571.17,"endTime":574.62,"body":"And I thought, wow, that's just"},{"speaker":"SAMUEL DEGUELDRE","startTime":571.17,"endTime":574.62,"body":"really so subtle."},{"speaker":"OLIVIER COLSON","startTime":575.58,"endTime":578.07,"body":"Okay. And how do you debug them then?"},{"speaker":"OLIVIER COLSON","startTime":578.07,"endTime":581.07,"body":"Uh, is there any specific thing to"},{"speaker":"OLIVIER COLSON","startTime":578.07,"endTime":581.07,"body":"JavaScript, or is it like for any"},{"speaker":"OLIVIER COLSON","startTime":581.07,"endTime":581.85,"body":"other language."},{"speaker":"SAMUEL DEGUELDRE","startTime":581.85,"endTime":582.93,"body":"Uh, yeah."},{"speaker":"SAMUEL DEGUELDRE","startTime":582.93,"endTime":588.36,"body":"So for, for performance, uh, like"},{"speaker":"SAMUEL DEGUELDRE","startTime":582.93,"endTime":588.36,"body":"execution time, uh, like most"},{"speaker":"SAMUEL DEGUELDRE","startTime":588.36,"endTime":593.19,"body":"languages, uh, you would use a"},{"speaker":"SAMUEL DEGUELDRE","startTime":588.36,"endTime":593.19,"body":"profiler, and the Chrome DevTools have"},{"speaker":"SAMUEL DEGUELDRE","startTime":593.19,"endTime":594.45,"body":"a great built-in profiler."},{"speaker":"SAMUEL DEGUELDRE","startTime":594.45,"endTime":598.26,"body":"So if you know how to use a profiler,"},{"speaker":"SAMUEL DEGUELDRE","startTime":594.45,"endTime":598.26,"body":"uh, you'll feel right at home."},{"speaker":"SAMUEL DEGUELDRE","startTime":598.26,"endTime":599.94,"body":"It has some nice features."},{"speaker":"SAMUEL DEGUELDRE","startTime":599.94,"endTime":601.68,"body":"You just press record, and do some"},{"speaker":"SAMUEL DEGUELDRE","startTime":599.94,"endTime":601.68,"body":"stuff."},{"speaker":"SAMUEL DEGUELDRE","startTime":602.46,"endTime":606.6,"body":"Uh, stop. And then you get a nice,"},{"speaker":"SAMUEL DEGUELDRE","startTime":602.46,"endTime":606.6,"body":"uh, flame chart or flame graph."},{"speaker":"SAMUEL DEGUELDRE","startTime":606.6,"endTime":607.89,"body":"I never know which one of the two it"},{"speaker":"SAMUEL DEGUELDRE","startTime":606.6,"endTime":607.89,"body":"is."},{"speaker":"SAMUEL DEGUELDRE","startTime":608.01,"endTime":609.09,"body":"So one graph, I think. Yeah."},{"speaker":"SAMUEL DEGUELDRE","startTime":609.09,"endTime":610.53,"body":"So there's, there's two."},{"speaker":"SAMUEL DEGUELDRE","startTime":610.53,"endTime":614.79,"body":"And I think the one that Chrome has"},{"speaker":"SAMUEL DEGUELDRE","startTime":610.53,"endTime":614.79,"body":"is a flame graph."},{"speaker":"SAMUEL DEGUELDRE","startTime":614.79,"endTime":616.47,"body":"And speed scope displays a flame"},{"speaker":"SAMUEL DEGUELDRE","startTime":614.79,"endTime":616.47,"body":"chart."},{"speaker":"SAMUEL DEGUELDRE","startTime":617.52,"endTime":618.6,"body":"So you don't agree."},{"speaker":"SAMUEL DEGUELDRE","startTime":618.6,"endTime":623.67,"body":"The, the subtle difference is that a"},{"speaker":"SAMUEL DEGUELDRE","startTime":618.6,"endTime":623.67,"body":"flame a flame graph is in time order."},{"speaker":"SAMUEL DEGUELDRE","startTime":623.67,"endTime":628.56,"body":"So you have each successive function"},{"speaker":"SAMUEL DEGUELDRE","startTime":623.67,"endTime":628.56,"body":"call at the point where it was called,"},{"speaker":"SAMUEL DEGUELDRE","startTime":628.56,"endTime":629.67,"body":"and you see how long it takes."},{"speaker":"SAMUEL DEGUELDRE","startTime":629.67,"endTime":633.45,"body":"And then, in the flame chart, you"},{"speaker":"SAMUEL DEGUELDRE","startTime":629.67,"endTime":633.45,"body":"collapse stack frames that are the"},{"speaker":"SAMUEL DEGUELDRE","startTime":633.45,"endTime":637.8,"body":"same function. And so you can see"},{"speaker":"SAMUEL DEGUELDRE","startTime":633.45,"endTime":637.8,"body":"overall the execution time, which"},{"speaker":"SAMUEL DEGUELDRE","startTime":637.8,"endTime":639.15,"body":"function took the most time."},{"speaker":"OLIVIER COLSON","startTime":639.15,"endTime":642.36,"body":"Okay, okay. And you kind of need both"},{"speaker":"OLIVIER COLSON","startTime":642.36,"endTime":645.33,"body":"you like the sequence of what you're"},{"speaker":"OLIVIER COLSON","startTime":642.36,"endTime":645.33,"body":"doing and the other will will tell you"},{"speaker":"OLIVIER COLSON","startTime":645.33,"endTime":647.64,"body":"you have to watch this function uh,"},{"speaker":"OLIVIER COLSON","startTime":645.33,"endTime":647.64,"body":"in particular."},{"speaker":"OLIVIER COLSON","startTime":647.64,"endTime":650.76,"body":"Okay. Uh, and so you were mentioning"},{"speaker":"OLIVIER COLSON","startTime":647.64,"endTime":650.76,"body":"runtime."},{"speaker":"OLIVIER COLSON","startTime":651.69,"endTime":655.56,"body":"You also have to manage the resources"},{"speaker":"OLIVIER COLSON","startTime":651.69,"endTime":655.56,"body":"around your code."},{"speaker":"OLIVIER COLSON","startTime":655.56,"endTime":656.76,"body":"So like memory."},{"speaker":"OLIVIER COLSON","startTime":656.76,"endTime":659.28,"body":"Yeah. Uh, is it a big problem with"},{"speaker":"OLIVIER COLSON","startTime":656.76,"endTime":659.28,"body":"JavaScript, then?"},{"speaker":"SAMUEL DEGUELDRE","startTime":659.28,"endTime":663.57,"body":"So I think this one is a bigger"},{"speaker":"SAMUEL DEGUELDRE","startTime":663.57,"endTime":669.39,"body":"the server side because, like on the"},{"speaker":"SAMUEL DEGUELDRE","startTime":663.57,"endTime":669.39,"body":"Python side, we have we spawn workers"},{"speaker":"SAMUEL DEGUELDRE","startTime":669.39,"endTime":672.9,"body":", and then uh, we regularly respawn"},{"speaker":"SAMUEL DEGUELDRE","startTime":669.39,"endTime":672.9,"body":"them after a while."},{"speaker":"SAMUEL DEGUELDRE","startTime":672.99,"endTime":679.23,"body":"Um, and so when a request comes in,"},{"speaker":"SAMUEL DEGUELDRE","startTime":672.99,"endTime":679.23,"body":"um, generally, all of the memory"},{"speaker":"SAMUEL DEGUELDRE","startTime":679.23,"endTime":682.23,"body":"that's going to be allocated is going"},{"speaker":"SAMUEL DEGUELDRE","startTime":679.23,"endTime":682.23,"body":"to be tied to that request."},{"speaker":"SAMUEL DEGUELDRE","startTime":682.23,"endTime":686.25,"body":"And as soon as the request has been"},{"speaker":"SAMUEL DEGUELDRE","startTime":682.23,"endTime":686.25,"body":"responded to and it goes out of scope,"},{"speaker":"SAMUEL DEGUELDRE","startTime":686.43,"endTime":689.04,"body":"uh, all of the associated memory just"},{"speaker":"SAMUEL DEGUELDRE","startTime":686.43,"endTime":689.04,"body":"vanishes."},{"speaker":"SAMUEL DEGUELDRE","startTime":689.73,"endTime":692.1,"body":"It's garbage collected, and it works"},{"speaker":"SAMUEL DEGUELDRE","startTime":689.73,"endTime":692.1,"body":"quite well."},{"speaker":"SAMUEL DEGUELDRE","startTime":692.1,"endTime":696.0,"body":"So the life cycle on the Python side"},{"speaker":"SAMUEL DEGUELDRE","startTime":692.1,"endTime":696.0,"body":"is quite short."},{"speaker":"SAMUEL DEGUELDRE","startTime":696.54,"endTime":702.21,"body":"Uh, but on the JavaScript side, like,"},{"speaker":"SAMUEL DEGUELDRE","startTime":696.54,"endTime":702.21,"body":"people will often, uh, first thing in,"},{"speaker":"SAMUEL DEGUELDRE","startTime":702.21,"endTime":705.21,"body":"in the day, open up Odoo and they"},{"speaker":"SAMUEL DEGUELDRE","startTime":702.21,"endTime":705.21,"body":"leave it open all day."},{"speaker":"SAMUEL DEGUELDRE","startTime":705.21,"endTime":710.22,"body":"And so like, we have to be more"},{"speaker":"SAMUEL DEGUELDRE","startTime":705.21,"endTime":710.22,"body":"conscious of memory than we, we have"},{"speaker":"SAMUEL DEGUELDRE","startTime":710.22,"endTime":712.14,"body":"to, to be on the Python side."},{"speaker":"SAMUEL DEGUELDRE","startTime":712.2,"endTime":716.58,"body":"Um, so it's more often a problem."},{"speaker":"SAMUEL DEGUELDRE","startTime":716.58,"endTime":721.2,"body":"Yeah, um, like just long-lived"},{"speaker":"SAMUEL DEGUELDRE","startTime":716.58,"endTime":721.2,"body":"applications in general, um, or"},{"speaker":"SAMUEL DEGUELDRE","startTime":721.2,"endTime":723.12,"body":"long-lived execution contexts."},{"speaker":"SAMUEL DEGUELDRE","startTime":723.12,"endTime":723.51,"body":"Right."},{"speaker":"OLIVIER COLSON","startTime":723.51,"endTime":727.92,"body":"And so what can what can happen really"},{"speaker":"OLIVIER COLSON","startTime":727.92,"endTime":728.94,"body":"can stay in the memory."},{"speaker":"OLIVIER COLSON","startTime":728.94,"endTime":731.76,"body":"Do you have do you have memory leaks"},{"speaker":"OLIVIER COLSON","startTime":728.94,"endTime":731.76,"body":"in JavaScript like you would have in"},{"speaker":"OLIVIER COLSON","startTime":731.79,"endTime":732.75,"body":"C? I don't know, uh."},{"speaker":"SAMUEL DEGUELDRE","startTime":732.75,"endTime":734.58,"body":"So it depends what you call a memory"},{"speaker":"SAMUEL DEGUELDRE","startTime":735.12,"endTime":735.9,"body":"Uh, so there's."},{"speaker":"OLIVIER COLSON","startTime":735.9,"endTime":737.61,"body":"Sort of have pointers to three here."},{"speaker":"OLIVIER COLSON","startTime":737.61,"endTime":739.26,"body":"So I guess it's easier, but still."},{"speaker":"OLIVIER COLSON","startTime":739.26,"endTime":739.89,"body":"So you can..."},{"speaker":"SAMUEL DEGUELDRE","startTime":739.89,"endTime":743.1,"body":"It can happen, right. There are hard"},{"speaker":"SAMUEL DEGUELDRE","startTime":743.1,"endTime":745.08,"body":"bugs. It's a bug in Chrome itself."},{"speaker":"SAMUEL DEGUELDRE","startTime":745.08,"endTime":748.98,"body":"And it can happen. But it's I don't"},{"speaker":"SAMUEL DEGUELDRE","startTime":745.08,"endTime":748.98,"body":"think I've ever found one."},{"speaker":"SAMUEL DEGUELDRE","startTime":749.01,"endTime":753.84,"body":"Um, and then they had you have what"},{"speaker":"SAMUEL DEGUELDRE","startTime":749.01,"endTime":753.84,"body":"we call memory leaks when we discuss"},{"speaker":"SAMUEL DEGUELDRE","startTime":753.84,"endTime":758.46,"body":"internally soft leaks where you have"},{"speaker":"SAMUEL DEGUELDRE","startTime":753.84,"endTime":758.46,"body":"objects that are still reachable."},{"speaker":"SAMUEL DEGUELDRE","startTime":758.46,"endTime":762.3,"body":"So if you were to try to access them"},{"speaker":"SAMUEL DEGUELDRE","startTime":758.46,"endTime":762.3,"body":"from JavaScript, there is a, there is"},{"speaker":"SAMUEL DEGUELDRE","startTime":762.3,"endTime":764.49,"body":"a path from a global object."},{"speaker":"SAMUEL DEGUELDRE","startTime":764.49,"endTime":769.65,"body":"So like the window or the the"},{"speaker":"SAMUEL DEGUELDRE","startTime":764.49,"endTime":769.65,"body":"document object or some HTML element"},{"speaker":"SAMUEL DEGUELDRE","startTime":769.65,"endTime":771.6,"body":"that's in the Dom, these are all"},{"speaker":"SAMUEL DEGUELDRE","startTime":769.65,"endTime":771.6,"body":"reachable."},{"speaker":"SAMUEL DEGUELDRE","startTime":772.32,"endTime":776.52,"body":"And so any object that's reachable"},{"speaker":"SAMUEL DEGUELDRE","startTime":772.32,"endTime":776.52,"body":"from these objects is also considered"},{"speaker":"SAMUEL DEGUELDRE","startTime":776.52,"endTime":777.96,"body":"reachable and cannot be garbage"},{"speaker":"SAMUEL DEGUELDRE","startTime":776.52,"endTime":777.96,"body":"collected."},{"speaker":"SAMUEL DEGUELDRE","startTime":778.68,"endTime":784.86,"body":"And a lot of the time the issues that"},{"speaker":"SAMUEL DEGUELDRE","startTime":778.68,"endTime":784.86,"body":"we found are some objects are still"},{"speaker":"SAMUEL DEGUELDRE","startTime":784.86,"endTime":786.78,"body":"reachable but are actually no longer"},{"speaker":"SAMUEL DEGUELDRE","startTime":784.86,"endTime":786.78,"body":"useful."},{"speaker":"SAMUEL DEGUELDRE","startTime":787.41,"endTime":791.25,"body":"And so this is the biggest source of"},{"speaker":"SAMUEL DEGUELDRE","startTime":787.41,"endTime":791.25,"body":"memory leaks that we have."},{"speaker":"SAMUEL DEGUELDRE","startTime":791.37,"endTime":795.75,"body":"And uh, typical examples can be you"},{"speaker":"SAMUEL DEGUELDRE","startTime":791.37,"endTime":795.75,"body":"have an event listener that hasn't"},{"speaker":"SAMUEL DEGUELDRE","startTime":795.75,"endTime":796.89,"body":"been cleaned up correctly."},{"speaker":"SAMUEL DEGUELDRE","startTime":796.89,"endTime":800.49,"body":"And so this is both a memory leak but"},{"speaker":"SAMUEL DEGUELDRE","startTime":796.89,"endTime":800.49,"body":"also a problem of correctness."},{"speaker":"SAMUEL DEGUELDRE","startTime":800.49,"endTime":802.89,"body":"Right. Because you have an event"},{"speaker":"SAMUEL DEGUELDRE","startTime":800.49,"endTime":802.89,"body":"listener that you don't want to get"},{"speaker":"SAMUEL DEGUELDRE","startTime":802.89,"endTime":806.49,"body":"called, but it might still get called"},{"speaker":"SAMUEL DEGUELDRE","startTime":802.89,"endTime":806.49,"body":"because it's he's an event come"},{"speaker":"SAMUEL DEGUELDRE","startTime":806.49,"endTime":809.76,"body":"through. So this one is event"},{"speaker":"SAMUEL DEGUELDRE","startTime":806.49,"endTime":809.76,"body":"listener on the."},{"speaker":"SAMUEL DEGUELDRE","startTime":810.53,"endTime":815.0,"body":"HTML elements, but what's more common"},{"speaker":"SAMUEL DEGUELDRE","startTime":810.53,"endTime":815.0,"body":"is, for example, an event listener on"},{"speaker":"SAMUEL DEGUELDRE","startTime":815.0,"endTime":819.11,"body":"the window. So components, sometimes"},{"speaker":"SAMUEL DEGUELDRE","startTime":815.0,"endTime":819.11,"body":"want to get mounted and listen for"},{"speaker":"SAMUEL DEGUELDRE","startTime":819.11,"endTime":821.6,"body":"events on the window. For example,"},{"speaker":"SAMUEL DEGUELDRE","startTime":819.11,"endTime":821.6,"body":"they want to know if the window is"},{"speaker":"SAMUEL DEGUELDRE","startTime":821.6,"endTime":824.12,"body":"getting resized. And so they'll"},{"speaker":"SAMUEL DEGUELDRE","startTime":821.6,"endTime":824.12,"body":"attach an event listener on the"},{"speaker":"SAMUEL DEGUELDRE","startTime":824.12,"endTime":828.68,"body":"window. And if ondestroy they forget"},{"speaker":"SAMUEL DEGUELDRE","startTime":824.12,"endTime":828.68,"body":"to clean it up, it means that since"},{"speaker":"SAMUEL DEGUELDRE","startTime":828.68,"endTime":832.22,"body":"the handler is allocated, the"},{"speaker":"SAMUEL DEGUELDRE","startTime":828.68,"endTime":832.22,"body":"component is still allocated because"},{"speaker":"SAMUEL DEGUELDRE","startTime":832.22,"endTime":835.55,"body":"it's reachable. Like if an event"},{"speaker":"SAMUEL DEGUELDRE","startTime":832.22,"endTime":835.55,"body":"happens, it's going to call code"},{"speaker":"SAMUEL DEGUELDRE","startTime":835.82,"endTime":837.47,"body":"inside of the component."},{"speaker":"SAMUEL DEGUELDRE","startTime":837.68,"endTime":840.74,"body":"And then, if the component is"},{"speaker":"SAMUEL DEGUELDRE","startTime":837.68,"endTime":840.74,"body":"reachable, the application is"},{"speaker":"SAMUEL DEGUELDRE","startTime":840.74,"endTime":844.85,"body":"reachable. If the application is"},{"speaker":"SAMUEL DEGUELDRE","startTime":840.74,"endTime":844.85,"body":"reachable, all of the components from"},{"speaker":"SAMUEL DEGUELDRE","startTime":844.85,"endTime":846.59,"body":"that point in time are still"},{"speaker":"SAMUEL DEGUELDRE","startTime":844.85,"endTime":846.59,"body":"reachable."},{"speaker":"SAMUEL DEGUELDRE","startTime":847.22,"endTime":848.75,"body":"And also all of the associated Dom"},{"speaker":"SAMUEL DEGUELDRE","startTime":847.22,"endTime":848.75,"body":"nodes."},{"speaker":"SAMUEL DEGUELDRE","startTime":849.02,"endTime":853.22,"body":"So it's it can be a lot of memory for"},{"speaker":"SAMUEL DEGUELDRE","startTime":849.02,"endTime":853.22,"body":"just forgetting to clean up one event"},{"speaker":"SAMUEL DEGUELDRE","startTime":853.22,"endTime":857.54,"body":"listener. And so that's why we also"},{"speaker":"SAMUEL DEGUELDRE","startTime":853.22,"endTime":857.54,"body":"in the framework have utility"},{"speaker":"SAMUEL DEGUELDRE","startTime":857.54,"endTime":859.97,"body":"functions that will it can be really"},{"speaker":"SAMUEL DEGUELDRE","startTime":857.54,"endTime":859.97,"body":"tricky to to find."},{"speaker":"OLIVIER COLSON","startTime":859.97,"endTime":867.26,"body":"I mean you can have one path like well"},{"speaker":"OLIVIER COLSON","startTime":867.26,"endTime":869.66,"body":"stay into the memory. So how do you"},{"speaker":"OLIVIER COLSON","startTime":867.26,"endTime":869.66,"body":"find them?"},{"speaker":"SAMUEL DEGUELDRE","startTime":869.66,"endTime":873.53,"body":"So on the one hand you might think,"},{"speaker":"SAMUEL DEGUELDRE","startTime":873.56,"endTime":876.38,"body":"leaks all of this memory. So it's"},{"speaker":"SAMUEL DEGUELDRE","startTime":873.56,"endTime":876.38,"body":"going to be difficult to find."},{"speaker":"SAMUEL DEGUELDRE","startTime":876.38,"endTime":879.5,"body":"But generally what you do is in a"},{"speaker":"SAMUEL DEGUELDRE","startTime":876.38,"endTime":879.5,"body":"Chrome DevTools, you take a memory"},{"speaker":"SAMUEL DEGUELDRE","startTime":879.5,"endTime":884.72,"body":"snapshot and then you can find this"},{"speaker":"SAMUEL DEGUELDRE","startTime":879.5,"endTime":884.72,"body":"huge amount of leaked memory where you"},{"speaker":"SAMUEL DEGUELDRE","startTime":884.72,"endTime":887.99,"body":"know, these components, they're"},{"speaker":"SAMUEL DEGUELDRE","startTime":884.72,"endTime":887.99,"body":"destroyed, so they shouldn't be"},{"speaker":"SAMUEL DEGUELDRE","startTime":887.99,"endTime":890.39,"body":"allocated. And then you see how"},{"speaker":"SAMUEL DEGUELDRE","startTime":887.99,"endTime":890.39,"body":"they're reachable."},{"speaker":"SAMUEL DEGUELDRE","startTime":890.39,"endTime":893.93,"body":"And by seeing how they're reachable,"},{"speaker":"SAMUEL DEGUELDRE","startTime":890.39,"endTime":893.93,"body":"like most of these, these links are"},{"speaker":"SAMUEL DEGUELDRE","startTime":893.93,"endTime":895.76,"body":"obviously it's like a component has a"},{"speaker":"SAMUEL DEGUELDRE","startTime":893.93,"endTime":895.76,"body":"parent."},{"speaker":"SAMUEL DEGUELDRE","startTime":896.06,"endTime":897.95,"body":"So it's reachable through its parent."},{"speaker":"SAMUEL DEGUELDRE","startTime":897.95,"endTime":902.27,"body":"And then you just go down the chain"},{"speaker":"SAMUEL DEGUELDRE","startTime":897.95,"endTime":902.27,"body":"until you find something where it"},{"speaker":"SAMUEL DEGUELDRE","startTime":902.27,"endTime":908.39,"body":"shouldn't be there. And the memory"},{"speaker":"SAMUEL DEGUELDRE","startTime":902.27,"endTime":908.39,"body":"snapshots are generally, um, sorted by"},{"speaker":"SAMUEL DEGUELDRE","startTime":908.45,"endTime":913.7,"body":"the depth from what they call garbage"},{"speaker":"SAMUEL DEGUELDRE","startTime":908.45,"endTime":913.7,"body":"collector routes, GC routes."},{"speaker":"SAMUEL DEGUELDRE","startTime":913.88,"endTime":914.69,"body":"And so..."},{"speaker":"OLIVIER COLSON","startTime":914.69,"endTime":917.93,"body":"So the number of links to reach them"},{"speaker":"SAMUEL DEGUELDRE","startTime":917.93,"endTime":923.42,"body":"Yeah, and so since they're sorted by,"},{"speaker":"SAMUEL DEGUELDRE","startTime":923.63,"endTime":927.59,"body":"Yeah, increasing length rather than"},{"speaker":"SAMUEL DEGUELDRE","startTime":923.63,"endTime":927.59,"body":"increasing depth, it means that the"},{"speaker":"SAMUEL DEGUELDRE","startTime":927.59,"endTime":932.24,"body":"objects that are leaked that are"},{"speaker":"SAMUEL DEGUELDRE","startTime":927.59,"endTime":932.24,"body":"responsible are likely to be at the"},{"speaker":"SAMUEL DEGUELDRE","startTime":932.24,"endTime":933.86,"body":"top. And so you can find them like"},{"speaker":"SAMUEL DEGUELDRE","startTime":932.24,"endTime":933.86,"body":"this."},{"speaker":"OLIVIER COLSON","startTime":934.25,"endTime":937.46,"body":"And so you compare multiple snapshots"},{"speaker":"OLIVIER COLSON","startTime":937.46,"endTime":938.57,"body":"them and what stays. Something like"},{"speaker":"OLIVIER COLSON","startTime":937.46,"endTime":938.57,"body":"that?"},{"speaker":"SAMUEL DEGUELDRE","startTime":938.96,"endTime":943.01,"body":"Yeah. So the Chrome dev tools have"},{"speaker":"SAMUEL DEGUELDRE","startTime":943.01,"endTime":946.22,"body":"take a snapshot at one point in time,"},{"speaker":"SAMUEL DEGUELDRE","startTime":943.01,"endTime":946.22,"body":"then take a different snapshot, and"},{"speaker":"SAMUEL DEGUELDRE","startTime":946.22,"endTime":950.75,"body":"then you can see which objects"},{"speaker":"SAMUEL DEGUELDRE","startTime":946.22,"endTime":950.75,"body":"existed in one snapshot and not in the"},{"speaker":"SAMUEL DEGUELDRE","startTime":950.75,"endTime":955.82,"body":"other. And so what you would"},{"speaker":"SAMUEL DEGUELDRE","startTime":950.75,"endTime":955.82,"body":"typically do is you have a flow that,"},{"speaker":"SAMUEL DEGUELDRE","startTime":955.82,"endTime":959.93,"body":"you know, leaks some memory. Because"},{"speaker":"SAMUEL DEGUELDRE","startTime":955.82,"endTime":959.93,"body":"if you do it repeatedly, uh, the, the"},{"speaker":"SAMUEL DEGUELDRE","startTime":959.93,"endTime":961.7,"body":"memory usage of the application"},{"speaker":"SAMUEL DEGUELDRE","startTime":959.93,"endTime":961.7,"body":"balloons."},{"speaker":"SAMUEL DEGUELDRE","startTime":962.39,"endTime":966.83,"body":"And so what you do is you first do"},{"speaker":"SAMUEL DEGUELDRE","startTime":962.39,"endTime":966.83,"body":"the flow once, just so that all of the"},{"speaker":"SAMUEL DEGUELDRE","startTime":966.83,"endTime":969.77,"body":"things that need to be allocated one"},{"speaker":"SAMUEL DEGUELDRE","startTime":966.83,"endTime":969.77,"body":"off for the duration of the"},{"speaker":"SAMUEL DEGUELDRE","startTime":969.77,"endTime":971.39,"body":"application are, are allocated."},{"speaker":"SAMUEL DEGUELDRE","startTime":971.39,"endTime":975.68,"body":"And then you take a snapshot and then"},{"speaker":"SAMUEL DEGUELDRE","startTime":971.39,"endTime":975.68,"body":"you do the flow again."},{"speaker":"SAMUEL DEGUELDRE","startTime":975.68,"endTime":979.7,"body":"Then you do a second snapshot, and"},{"speaker":"SAMUEL DEGUELDRE","startTime":975.68,"endTime":979.7,"body":"then you do the flow a third time."},{"speaker":"SAMUEL DEGUELDRE","startTime":979.7,"endTime":981.32,"body":"And you take a third snapshot."},{"speaker":"SAMUEL DEGUELDRE","startTime":981.32,"endTime":985.37,"body":"And now you, you see the, the objects"},{"speaker":"SAMUEL DEGUELDRE","startTime":981.32,"endTime":985.37,"body":"that are still alive that were"},{"speaker":"SAMUEL DEGUELDRE","startTime":985.37,"endTime":989.15,"body":"allocated between the first and the"},{"speaker":"SAMUEL DEGUELDRE","startTime":985.37,"endTime":989.15,"body":"second and all of these objects,"},{"speaker":"SAMUEL DEGUELDRE","startTime":989.15,"endTime":992.27,"body":"because you've done the flow a third"},{"speaker":"SAMUEL DEGUELDRE","startTime":989.15,"endTime":992.27,"body":"time, they should have been garbage"},{"speaker":"SAMUEL DEGUELDRE","startTime":992.27,"endTime":994.97,"body":"collected and reallocated, but they"},{"speaker":"SAMUEL DEGUELDRE","startTime":992.27,"endTime":994.97,"body":"wouldn't be the same objects."},{"speaker":"SAMUEL DEGUELDRE","startTime":994.97,"endTime":997.85,"body":"Right? So between snapshot one and"},{"speaker":"SAMUEL DEGUELDRE","startTime":994.97,"endTime":997.85,"body":"snapshot two, there should be"},{"speaker":"SAMUEL DEGUELDRE","startTime":997.85,"endTime":998.87,"body":"basically nothing."},{"speaker":"SAMUEL DEGUELDRE","startTime":998.87,"endTime":1002.38,"body":"Uh, basically all, all the things"},{"speaker":"SAMUEL DEGUELDRE","startTime":998.87,"endTime":1002.38,"body":"that you should see in the memory"},{"speaker":"SAMUEL DEGUELDRE","startTime":1002.38,"endTime":1006.46,"body":"snapshot are Chrome internals like"},{"speaker":"SAMUEL DEGUELDRE","startTime":1002.38,"endTime":1006.46,"body":"compiled code, interned strings, that"},{"speaker":"SAMUEL DEGUELDRE","startTime":1006.46,"endTime":1009.4,"body":"sort of stuff. This is nothing to"},{"speaker":"SAMUEL DEGUELDRE","startTime":1006.46,"endTime":1009.4,"body":"worry about, but if you see objects or"},{"speaker":"SAMUEL DEGUELDRE","startTime":1009.4,"endTime":1013.39,"body":"components or Dom elements, this is"},{"speaker":"SAMUEL DEGUELDRE","startTime":1009.4,"endTime":1013.39,"body":"when you know you've got a memory"},{"speaker":"SAMUEL DEGUELDRE","startTime":1013.39,"endTime":1014.65,"body":"leak. Clean things properly."},{"speaker":"SAMUEL DEGUELDRE","startTime":1014.65,"endTime":1018.91,"body":"Yeah. And at that point, you can"},{"speaker":"SAMUEL DEGUELDRE","startTime":1014.65,"endTime":1018.91,"body":"start, uh, looking at the chains of"},{"speaker":"SAMUEL DEGUELDRE","startTime":1018.91,"endTime":1022.75,"body":"retainers and finding finding out"},{"speaker":"SAMUEL DEGUELDRE","startTime":1018.91,"endTime":1022.75,"body":"what's retaining the memory."},{"speaker":"OLIVIER COLSON","startTime":1023.05,"endTime":1027.55,"body":"Okay. I would say that that's like the"},{"speaker":"OLIVIER COLSON","startTime":1027.55,"endTime":1031.18,"body":"you can use, maybe before that,"},{"speaker":"OLIVIER COLSON","startTime":1027.55,"endTime":1031.18,"body":"because then you need to know what"},{"speaker":"OLIVIER COLSON","startTime":1031.18,"endTime":1033.04,"body":"flow is causing the problem?"},{"speaker":"OLIVIER COLSON","startTime":1033.04,"endTime":1039.55,"body":"So you need to have already an idea of"},{"speaker":"OLIVIER COLSON","startTime":1033.04,"endTime":1039.55,"body":"where, where the issue is, is, uh, is"},{"speaker":"OLIVIER COLSON","startTime":1039.55,"endTime":1041.77,"body":"there something else that you can use"},{"speaker":"OLIVIER COLSON","startTime":1039.55,"endTime":1041.77,"body":"to track?"},{"speaker":"OLIVIER COLSON","startTime":1041.77,"endTime":1047.23,"body":"Well, what part of your, of your"},{"speaker":"OLIVIER COLSON","startTime":1041.77,"endTime":1047.23,"body":"website, uh, is, is causing issues?"},{"speaker":"SAMUEL DEGUELDRE","startTime":1047.38,"endTime":1052.36,"body":"Yeah. So as I was saying, the Chrome"},{"speaker":"SAMUEL DEGUELDRE","startTime":1052.36,"endTime":1055.18,"body":"uh, as their name might suggest."},{"speaker":"SAMUEL DEGUELDRE","startTime":1055.57,"endTime":1061.03,"body":"Um, and specifically for memory,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1055.57,"endTime":1061.03,"body":"there are two other, uh, types of, uh,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1061.03,"endTime":1062.53,"body":"measurements that you can make."},{"speaker":"SAMUEL DEGUELDRE","startTime":1062.8,"endTime":1066.88,"body":"Uh, one of them is, um, allocation"},{"speaker":"SAMUEL DEGUELDRE","startTime":1062.8,"endTime":1066.88,"body":"instrumentation on timeline."},{"speaker":"SAMUEL DEGUELDRE","startTime":1066.88,"endTime":1072.67,"body":"And this one, uh, is a great tool to"},{"speaker":"SAMUEL DEGUELDRE","startTime":1066.88,"endTime":1072.67,"body":"identify, uh, like the, the point in"},{"speaker":"SAMUEL DEGUELDRE","startTime":1072.67,"endTime":1074.47,"body":"time where memory is actually leaked."},{"speaker":"SAMUEL DEGUELDRE","startTime":1074.47,"endTime":1078.91,"body":"So when you start recording, you get"},{"speaker":"SAMUEL DEGUELDRE","startTime":1074.47,"endTime":1078.91,"body":"this sort of time series where every"},{"speaker":"SAMUEL DEGUELDRE","startTime":1078.91,"endTime":1083.62,"body":"time memory is allocated, Chrome will"},{"speaker":"SAMUEL DEGUELDRE","startTime":1078.91,"endTime":1083.62,"body":"display, uh, a blue bar, vertical bar,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1083.89,"endTime":1087.46,"body":"um, that corresponds to the amount of"},{"speaker":"SAMUEL DEGUELDRE","startTime":1083.89,"endTime":1087.46,"body":"memory that was allocated."},{"speaker":"SAMUEL DEGUELDRE","startTime":1087.46,"endTime":1092.38,"body":"And as the application keeps running,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1087.46,"endTime":1092.38,"body":"this bar will become partly gray"},{"speaker":"SAMUEL DEGUELDRE","startTime":1092.38,"endTime":1096.1,"body":"colored to represent all of the"},{"speaker":"SAMUEL DEGUELDRE","startTime":1092.38,"endTime":1096.1,"body":"memory that was allocated that has now"},{"speaker":"SAMUEL DEGUELDRE","startTime":1096.31,"endTime":1100.24,"body":"been reclaimed. And so when you see a"},{"speaker":"SAMUEL DEGUELDRE","startTime":1096.31,"endTime":1100.24,"body":"huge blue bar, and then it becomes"},{"speaker":"SAMUEL DEGUELDRE","startTime":1100.24,"endTime":1103.27,"body":"entirely gray, that just means you're"},{"speaker":"SAMUEL DEGUELDRE","startTime":1100.24,"endTime":1103.27,"body":"allocating a lot of memory, and then"},{"speaker":"SAMUEL DEGUELDRE","startTime":1103.27,"endTime":1105.46,"body":"you're allocating it correctly, and"},{"speaker":"SAMUEL DEGUELDRE","startTime":1103.27,"endTime":1105.46,"body":"there's no problem."},{"speaker":"SAMUEL DEGUELDRE","startTime":1105.61,"endTime":1109.72,"body":"But if there's a remaining blue bit,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1105.61,"endTime":1109.72,"body":"then that means that this memory is."},{"speaker":"SAMUEL DEGUELDRE","startTime":1110.4,"endTime":1114.6,"body":"And so you can select this in the"},{"speaker":"SAMUEL DEGUELDRE","startTime":1110.4,"endTime":1114.6,"body":"timeline and identify these objects."},{"speaker":"SAMUEL DEGUELDRE","startTime":1114.6,"endTime":1118.44,"body":"And it's going to look very similar"},{"speaker":"SAMUEL DEGUELDRE","startTime":1114.6,"endTime":1118.44,"body":"to the heap snapshots."},{"speaker":"OLIVIER COLSON","startTime":1118.95,"endTime":1120.24,"body":"But you don't have to bother doing"},{"speaker":"OLIVIER COLSON","startTime":1120.57,"endTime":1121.89,"body":"The snapshots and comparing them."},{"speaker":"OLIVIER COLSON","startTime":1121.89,"endTime":1126.39,"body":"And so it's like it gives you a"},{"speaker":"OLIVIER COLSON","startTime":1121.89,"endTime":1126.39,"body":"faster view of where there could be a"},{"speaker":"OLIVIER COLSON","startTime":1126.39,"endTime":1128.52,"body":"problem. And then you can"},{"speaker":"OLIVIER COLSON","startTime":1126.39,"endTime":1128.52,"body":"investigate, I guess, with the"},{"speaker":"OLIVIER COLSON","startTime":1128.52,"endTime":1128.94,"body":"snapshots, right?"},{"speaker":"SAMUEL DEGUELDRE","startTime":1129.15,"endTime":1134.37,"body":"Yeah. So it's I would say it's, it's"},{"speaker":"SAMUEL DEGUELDRE","startTime":1134.37,"endTime":1136.59,"body":"complete because obviously you"},{"speaker":"SAMUEL DEGUELDRE","startTime":1134.37,"endTime":1136.59,"body":"haven't done the entire flow."},{"speaker":"SAMUEL DEGUELDRE","startTime":1136.59,"endTime":1141.78,"body":"And sometimes objects can remain in"},{"speaker":"SAMUEL DEGUELDRE","startTime":1136.59,"endTime":1141.78,"body":"memory and linger for a while, but not"},{"speaker":"SAMUEL DEGUELDRE","startTime":1141.78,"endTime":1145.8,"body":"forever. Like, for example, it could"},{"speaker":"SAMUEL DEGUELDRE","startTime":1141.78,"endTime":1145.8,"body":"remain for half the flow or"},{"speaker":"SAMUEL DEGUELDRE","startTime":1145.8,"endTime":1148.65,"body":"three-quarters of the flow, but in"},{"speaker":"SAMUEL DEGUELDRE","startTime":1145.8,"endTime":1148.65,"body":"the end, it's going to be garbage"},{"speaker":"SAMUEL DEGUELDRE","startTime":1148.65,"endTime":1152.58,"body":"collected. There are also sometimes"},{"speaker":"SAMUEL DEGUELDRE","startTime":1148.65,"endTime":1152.58,"body":"things that are kept in cache for, uh,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1152.58,"endTime":1153.6,"body":"some amount of time."},{"speaker":"SAMUEL DEGUELDRE","startTime":1153.6,"endTime":1158.43,"body":"And so, um, yeah, I would say it's"},{"speaker":"SAMUEL DEGUELDRE","startTime":1153.6,"endTime":1158.43,"body":"uh, it's a more blunt tool, but it's"},{"speaker":"SAMUEL DEGUELDRE","startTime":1158.43,"endTime":1162.3,"body":"also much faster to find issues if"},{"speaker":"SAMUEL DEGUELDRE","startTime":1158.43,"endTime":1162.3,"body":"there's something obvious."},{"speaker":"OLIVIER COLSON","startTime":1162.3,"endTime":1166.68,"body":"Okay, okay. Is there something else we"},{"speaker":"SAMUEL DEGUELDRE","startTime":1166.68,"endTime":1171.57,"body":"Yeah. So the, the third one, uh, like"},{"speaker":"SAMUEL DEGUELDRE","startTime":1171.57,"endTime":1174.6,"body":"is, I would say, much less useful."},{"speaker":"SAMUEL DEGUELDRE","startTime":1174.75,"endTime":1179.4,"body":"Um, it's something that allows you to"},{"speaker":"SAMUEL DEGUELDRE","startTime":1174.75,"endTime":1179.4,"body":"record, um, allocations, but it"},{"speaker":"SAMUEL DEGUELDRE","startTime":1179.4,"endTime":1180.87,"body":"doesn't keep the objects in memory."},{"speaker":"SAMUEL DEGUELDRE","startTime":1180.87,"endTime":1181.89,"body":"It doesn't really do a snapshot."},{"speaker":"SAMUEL DEGUELDRE","startTime":1181.89,"endTime":1185.94,"body":"And so it's, it's more about seeing"},{"speaker":"SAMUEL DEGUELDRE","startTime":1181.89,"endTime":1185.94,"body":"which functions allocate a lot of"},{"speaker":"SAMUEL DEGUELDRE","startTime":1185.94,"endTime":1189.57,"body":"memory. And this one is less useful"},{"speaker":"SAMUEL DEGUELDRE","startTime":1185.94,"endTime":1189.57,"body":"for, uh, finding memory leaks."},{"speaker":"SAMUEL DEGUELDRE","startTime":1189.63,"endTime":1192.69,"body":"Uh, but it can be useful for"},{"speaker":"SAMUEL DEGUELDRE","startTime":1189.63,"endTime":1192.69,"body":"detecting things like, uh, what's"},{"speaker":"SAMUEL DEGUELDRE","startTime":1192.69,"endTime":1194.55,"body":"called garbage collector thrashing."},{"speaker":"SAMUEL DEGUELDRE","startTime":1194.64,"endTime":1197.88,"body":"Uh, that's what happens when you're"},{"speaker":"SAMUEL DEGUELDRE","startTime":1194.64,"endTime":1197.88,"body":"allocating a lot of memory and then"},{"speaker":"SAMUEL DEGUELDRE","startTime":1197.88,"endTime":1199.47,"body":"garbage-collecting it immediately."},{"speaker":"SAMUEL DEGUELDRE","startTime":1199.47,"endTime":1203.46,"body":"And because the garbage collector has"},{"speaker":"SAMUEL DEGUELDRE","startTime":1199.47,"endTime":1203.46,"body":"to, at some point, pause the execution"},{"speaker":"SAMUEL DEGUELDRE","startTime":1203.46,"endTime":1208.08,"body":"of the JavaScript to do the actual"},{"speaker":"SAMUEL DEGUELDRE","startTime":1203.46,"endTime":1208.08,"body":"garbage collection."},{"speaker":"SAMUEL DEGUELDRE","startTime":1208.38,"endTime":1210.0,"body":"Um, it can have a big performance"},{"speaker":"SAMUEL DEGUELDRE","startTime":1208.38,"endTime":1210.0,"body":"impact."},{"speaker":"SAMUEL DEGUELDRE","startTime":1210.66,"endTime":1214.65,"body":"But this one is kind of I would say"},{"speaker":"SAMUEL DEGUELDRE","startTime":1210.66,"endTime":1214.65,"body":"generally it's pretty obvious even"},{"speaker":"SAMUEL DEGUELDRE","startTime":1214.65,"endTime":1217.29,"body":"without using this tool, where where"},{"speaker":"SAMUEL DEGUELDRE","startTime":1214.65,"endTime":1217.29,"body":"your code is allocating a lot of"},{"speaker":"SAMUEL DEGUELDRE","startTime":1217.29,"endTime":1220.53,"body":"temporary objects. But if you're not"},{"speaker":"SAMUEL DEGUELDRE","startTime":1217.29,"endTime":1220.53,"body":"finding them, then you can use this"},{"speaker":"SAMUEL DEGUELDRE","startTime":1220.53,"endTime":1227.82,"body":"one. And also, um, if you want to"},{"speaker":"SAMUEL DEGUELDRE","startTime":1220.53,"endTime":1227.82,"body":"automate stuff, uh, this one has less"},{"speaker":"SAMUEL DEGUELDRE","startTime":1227.82,"endTime":1229.02,"body":"impact on performance."},{"speaker":"SAMUEL DEGUELDRE","startTime":1229.02,"endTime":1233.76,"body":"And so, for example, we have tools"},{"speaker":"SAMUEL DEGUELDRE","startTime":1229.02,"endTime":1233.76,"body":"that we use for testing that just"},{"speaker":"SAMUEL DEGUELDRE","startTime":1233.76,"endTime":1237.18,"body":"simulate a bunch of user interaction"},{"speaker":"SAMUEL DEGUELDRE","startTime":1233.76,"endTime":1237.18,"body":"for flows."},{"speaker":"SAMUEL DEGUELDRE","startTime":1237.18,"endTime":1242.88,"body":"It's possible to instrument, uh, a"},{"speaker":"SAMUEL DEGUELDRE","startTime":1237.18,"endTime":1242.88,"body":"chrome headless to, uh, record this"},{"speaker":"SAMUEL DEGUELDRE","startTime":1242.88,"endTime":1244.02,"body":"kind of, uh, of profile."},{"speaker":"SAMUEL DEGUELDRE","startTime":1244.02,"endTime":1247.98,"body":"And then you can have data about much"},{"speaker":"SAMUEL DEGUELDRE","startTime":1244.02,"endTime":1247.98,"body":"longer flows than would be practical"},{"speaker":"SAMUEL DEGUELDRE","startTime":1247.98,"endTime":1250.14,"body":"to do by hand. So it can be useful."},{"speaker":"SAMUEL DEGUELDRE","startTime":1250.14,"endTime":1254.94,"body":"I think there are kind of, uh, from"},{"speaker":"SAMUEL DEGUELDRE","startTime":1250.14,"endTime":1254.94,"body":"most useful to least useful in the"},{"speaker":"SAMUEL DEGUELDRE","startTime":1254.94,"endTime":1256.77,"body":"Chrome UI. So heap snapshot is most"},{"speaker":"SAMUEL DEGUELDRE","startTime":1254.94,"endTime":1256.77,"body":"useful."},{"speaker":"SAMUEL DEGUELDRE","startTime":1257.82,"endTime":1260.76,"body":"Uh, but sometimes it can take a"},{"speaker":"SAMUEL DEGUELDRE","startTime":1257.82,"endTime":1260.76,"body":"little bit to set up."},{"speaker":"SAMUEL DEGUELDRE","startTime":1260.88,"endTime":1265.86,"body":"Uh, allocation instrumentation on"},{"speaker":"SAMUEL DEGUELDRE","startTime":1260.88,"endTime":1265.86,"body":"timeline is, uh, blunt but fast."},{"speaker":"SAMUEL DEGUELDRE","startTime":1265.86,"endTime":1270.15,"body":"And then the last one is kind of just"},{"speaker":"SAMUEL DEGUELDRE","startTime":1265.86,"endTime":1270.15,"body":"it's more about performance problems"},{"speaker":"SAMUEL DEGUELDRE","startTime":1270.15,"endTime":1273.48,"body":"that are caused by memory allocations"},{"speaker":"SAMUEL DEGUELDRE","startTime":1270.15,"endTime":1273.48,"body":"than actual memory issues."},{"speaker":"SAMUEL DEGUELDRE","startTime":1273.48,"endTime":1273.78,"body":"Right."},{"speaker":"OLIVIER COLSON","startTime":1274.23,"endTime":1278.73,"body":"Okay. Outside of the dev tools, are"},{"speaker":"OLIVIER COLSON","startTime":1278.73,"endTime":1283.68,"body":"use or install towell, track"},{"speaker":"OLIVIER COLSON","startTime":1278.73,"endTime":1283.68,"body":"performance issues from a memory"},{"speaker":"OLIVIER COLSON","startTime":1283.68,"endTime":1284.31,"body":"perspective?"},{"speaker":"SAMUEL DEGUELDRE","startTime":1284.31,"endTime":1291.33,"body":"Yeah. So, um, a while back, I was, uh,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1291.33,"endTime":1294.3,"body":"memory leaks, uh, involving weakmaps."},{"speaker":"SAMUEL DEGUELDRE","startTime":1294.3,"endTime":1299.31,"body":"And what I started doing was I was"},{"speaker":"SAMUEL DEGUELDRE","startTime":1294.3,"endTime":1299.31,"body":"writing some JavaScript code to parse"},{"speaker":"SAMUEL DEGUELDRE","startTime":1299.31,"endTime":1301.32,"body":"the heap snapshots that are emitted"},{"speaker":"SAMUEL DEGUELDRE","startTime":1299.31,"endTime":1301.32,"body":"by Chrome."},{"speaker":"SAMUEL DEGUELDRE","startTime":1301.32,"endTime":1302.7,"body":"Like, you can export them."},{"speaker":"SAMUEL DEGUELDRE","startTime":1302.94,"endTime":1306.57,"body":"For example, if you want a flame"},{"speaker":"SAMUEL DEGUELDRE","startTime":1302.94,"endTime":1306.57,"body":"chart in speed scope, you can export"},{"speaker":"SAMUEL DEGUELDRE","startTime":1306.57,"endTime":1308.43,"body":"memory snapshots, uh, or performance"},{"speaker":"SAMUEL DEGUELDRE","startTime":1306.57,"endTime":1308.43,"body":"snapshots."},{"speaker":"SAMUEL DEGUELDRE","startTime":1308.79,"endTime":1312.09,"body":"Sorry. Um, and yeah, I guess also"},{"speaker":"SAMUEL DEGUELDRE","startTime":1308.79,"endTime":1312.09,"body":"memory snapshots."},{"speaker":"SAMUEL DEGUELDRE","startTime":1312.09,"endTime":1315.84,"body":"But you can export performance, uh,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1312.09,"endTime":1315.84,"body":"snap snapshots and memory snapshots,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1315.84,"endTime":1319.17,"body":"and performance snapshots. You can"},{"speaker":"SAMUEL DEGUELDRE","startTime":1315.84,"endTime":1319.17,"body":"load in speed, scope and get something"},{"speaker":"SAMUEL DEGUELDRE","startTime":1319.17,"endTime":1323.31,"body":"familiar. Because I think that's the"},{"speaker":"SAMUEL DEGUELDRE","startTime":1319.17,"endTime":1323.31,"body":"tool that we use for displaying Python"},{"speaker":"SAMUEL DEGUELDRE","startTime":1323.31,"endTime":1324.42,"body":"profiles or the one that we"},{"speaker":"SAMUEL DEGUELDRE","startTime":1323.31,"endTime":1324.42,"body":"recommend."},{"speaker":"SAMUEL DEGUELDRE","startTime":1324.78,"endTime":1328.08,"body":"So if you want to keep using the same"},{"speaker":"SAMUEL DEGUELDRE","startTime":1324.78,"endTime":1328.08,"body":"tool, you can and it can help you dig"},{"speaker":"SAMUEL DEGUELDRE","startTime":1328.08,"endTime":1332.79,"body":"down. And for memory, there's this"},{"speaker":"SAMUEL DEGUELDRE","startTime":1328.08,"endTime":1332.79,"body":"tool written by Facebook, which is an"},{"speaker":"SAMUEL DEGUELDRE","startTime":1332.79,"endTime":1334.41,"body":"npm package called memlab."},{"speaker":"SAMUEL DEGUELDRE","startTime":1334.59,"endTime":1340.05,"body":"And it has a lot of tools to interact"},{"speaker":"SAMUEL DEGUELDRE","startTime":1334.59,"endTime":1340.05,"body":"with memory snapshots because the"},{"speaker":"SAMUEL DEGUELDRE","startTime":1340.05,"endTime":1343.56,"body":"memory snapshots that are emitted by"},{"speaker":"SAMUEL DEGUELDRE","startTime":1340.05,"endTime":1343.56,"body":"Chrome, they're JSON, but they are"},{"speaker":"SAMUEL DEGUELDRE","startTime":1343.56,"endTime":1347.04,"body":"also like a specific kind of"},{"speaker":"SAMUEL DEGUELDRE","startTime":1343.56,"endTime":1347.04,"body":"formatted JSON."},{"speaker":"SAMUEL DEGUELDRE","startTime":1347.4,"endTime":1351.15,"body":"Um, and it represents a graph in the"},{"speaker":"SAMUEL DEGUELDRE","startTime":1347.4,"endTime":1351.15,"body":"least usable way."},{"speaker":"SAMUEL DEGUELDRE","startTime":1351.15,"endTime":1354.84,"body":"So you have to spend a lot of effort"},{"speaker":"SAMUEL DEGUELDRE","startTime":1351.15,"endTime":1354.84,"body":"just trying to reconstruct the graph"},{"speaker":"SAMUEL DEGUELDRE","startTime":1355.11,"endTime":1357.42,"body":"in a way that's it's easy to query"},{"speaker":"SAMUEL DEGUELDRE","startTime":1355.11,"endTime":1357.42,"body":"and memlab."},{"speaker":"SAMUEL DEGUELDRE","startTime":1357.42,"endTime":1358.95,"body":"They've kind of done that for you"},{"speaker":"SAMUEL DEGUELDRE","startTime":1357.42,"endTime":1358.95,"body":"already."},{"speaker":"OLIVIER COLSON","startTime":1359.46,"endTime":1363.84,"body":"So they give you an API to interact"},{"speaker":"OLIVIER COLSON","startTime":1363.84,"endTime":1367.29,"body":"do whatever analysis you want on them"},{"speaker":"OLIVIER COLSON","startTime":1363.84,"endTime":1367.29,"body":"to find what the problem is."},{"speaker":"SAMUEL DEGUELDRE","startTime":1367.29,"endTime":1371.16,"body":"Yeah. And also for the like the what I"},{"speaker":"SAMUEL DEGUELDRE","startTime":1371.37,"endTime":1374.82,"body":"differential snapshots where you take"},{"speaker":"SAMUEL DEGUELDRE","startTime":1371.37,"endTime":1374.82,"body":"a snapshot, take another snapshot,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1374.82,"endTime":1378.84,"body":"take a third snapshot and then"},{"speaker":"SAMUEL DEGUELDRE","startTime":1374.82,"endTime":1378.84,"body":"compare the first two, um, they, they"},{"speaker":"SAMUEL DEGUELDRE","startTime":1378.84,"endTime":1383.52,"body":"have a programmatic API where you"},{"speaker":"SAMUEL DEGUELDRE","startTime":1378.84,"endTime":1383.52,"body":"can, um, do some flows."},{"speaker":"SAMUEL DEGUELDRE","startTime":1383.61,"endTime":1385.8,"body":"Uh, some I think it's based on, on"},{"speaker":"SAMUEL DEGUELDRE","startTime":1383.61,"endTime":1385.8,"body":"selenium."},{"speaker":"SAMUEL DEGUELDRE","startTime":1386.28,"endTime":1390.42,"body":"So it's very similar to our tour"},{"speaker":"SAMUEL DEGUELDRE","startTime":1386.28,"endTime":1390.42,"body":"system, where you tell it to interact"},{"speaker":"SAMUEL DEGUELDRE","startTime":1390.42,"endTime":1393.3,"body":"with a page in a certain way and take"},{"speaker":"SAMUEL DEGUELDRE","startTime":1390.42,"endTime":1393.3,"body":"snapshots at various points."},{"speaker":"SAMUEL DEGUELDRE","startTime":1393.3,"endTime":1398.22,"body":"And this can be used, for example,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1393.3,"endTime":1398.22,"body":"to, to automate, uh, finding, finding"},{"speaker":"SAMUEL DEGUELDRE","startTime":1398.22,"endTime":1400.11,"body":"memory issues and or also to obtain"},{"speaker":"SAMUEL DEGUELDRE","startTime":1398.22,"endTime":1400.11,"body":"metrics."},{"speaker":"SAMUEL DEGUELDRE","startTime":1400.47,"endTime":1405.15,"body":"For example, if you wanted to see,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1400.47,"endTime":1405.15,"body":"uh, how memory usage, uh, evolves"},{"speaker":"SAMUEL DEGUELDRE","startTime":1405.15,"endTime":1406.35,"body":"across a certain flow."},{"speaker":"SAMUEL DEGUELDRE","startTime":1406.35,"endTime":1409.53,"body":"So it's very useful for automation"},{"speaker":"SAMUEL DEGUELDRE","startTime":1406.35,"endTime":1409.53,"body":"and it's very useful for advanced"},{"speaker":"SAMUEL DEGUELDRE","startTime":1409.65,"endTime":1413.73,"body":"analysis. But yeah, I would say, uh,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1409.65,"endTime":1413.73,"body":"by the point you're using memlab,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1413.73,"endTime":1416.91,"body":"you're probably already you probably"},{"speaker":"SAMUEL DEGUELDRE","startTime":1413.73,"endTime":1416.91,"body":"already know what you're doing."},{"speaker":"OLIVIER COLSON","startTime":1418.62,"endTime":1420.3,"body":"Okay. That's that's a good marker."},{"speaker":"OLIVIER COLSON","startTime":1420.6,"endTime":1423.69,"body":"Uh, all right. So we're reaching the"},{"speaker":"OLIVIER COLSON","startTime":1420.6,"endTime":1423.69,"body":"end of the episode, maybe before"},{"speaker":"OLIVIER COLSON","startTime":1423.69,"endTime":1427.32,"body":"ending, could you give us like, one"},{"speaker":"OLIVIER COLSON","startTime":1423.69,"endTime":1427.32,"body":"anecdote, something that happened"},{"speaker":"OLIVIER COLSON","startTime":1427.32,"endTime":1431.04,"body":"inside of Odoo where you had a big"},{"speaker":"OLIVIER COLSON","startTime":1427.32,"endTime":1431.04,"body":"performance issue like that in"},{"speaker":"OLIVIER COLSON","startTime":1431.04,"endTime":1433.38,"body":"JavaScript. So be it on runtime or"},{"speaker":"OLIVIER COLSON","startTime":1431.04,"endTime":1433.38,"body":"memory?"},{"speaker":"OLIVIER COLSON","startTime":1433.83,"endTime":1436.98,"body":"You decide. Uh, and what happened"},{"speaker":"OLIVIER COLSON","startTime":1433.83,"endTime":1436.98,"body":"with it?"},{"speaker":"SAMUEL DEGUELDRE","startTime":1437.19,"endTime":1443.37,"body":"Yeah. Um, so at some point, I was"},{"speaker":"SAMUEL DEGUELDRE","startTime":1443.4,"endTime":1447.93,"body":"um, their JavaScript code base to"},{"speaker":"SAMUEL DEGUELDRE","startTime":1443.4,"endTime":1447.93,"body":"update to the latest version of Owl."},{"speaker":"SAMUEL DEGUELDRE","startTime":1447.93,"endTime":1452.58,"body":"And, um, for some reason, because I"},{"speaker":"SAMUEL DEGUELDRE","startTime":1447.93,"endTime":1452.58,"body":"was on the PoS team, uh, there was"},{"speaker":"SAMUEL DEGUELDRE","startTime":1452.58,"endTime":1454.71,"body":"some performance issue reported by a"},{"speaker":"SAMUEL DEGUELDRE","startTime":1452.58,"endTime":1454.71,"body":"customer."},{"speaker":"SAMUEL DEGUELDRE","startTime":1455.19,"endTime":1458.97,"body":"And Antony, since I was on the post"},{"speaker":"SAMUEL DEGUELDRE","startTime":1455.19,"endTime":1458.97,"body":"team at the time, he said, well, uh,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1458.97,"endTime":1461.73,"body":"take a look at it. And so, uh, I took"},{"speaker":"SAMUEL DEGUELDRE","startTime":1458.97,"endTime":1461.73,"body":"a look, look at it."},{"speaker":"SAMUEL DEGUELDRE","startTime":1461.73,"endTime":1466.77,"body":"And so the PoS is kind of one of"},{"speaker":"SAMUEL DEGUELDRE","startTime":1461.73,"endTime":1466.77,"body":"those few places in Odoo where because"},{"speaker":"SAMUEL DEGUELDRE","startTime":1466.77,"endTime":1470.52,"body":"we wanted to work offline, uh, we"},{"speaker":"SAMUEL DEGUELDRE","startTime":1466.77,"endTime":1470.52,"body":"need to load all of the data so you,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1470.52,"endTime":1473.88,"body":"you get the same kind of performance"},{"speaker":"SAMUEL DEGUELDRE","startTime":1470.52,"endTime":1473.88,"body":"problems that you get on the server"},{"speaker":"SAMUEL DEGUELDRE","startTime":1473.88,"endTime":1475.11,"body":"just because you have a lot of data."},{"speaker":"SAMUEL DEGUELDRE","startTime":1475.11,"endTime":1480.63,"body":"Like when I was testing, I was"},{"speaker":"SAMUEL DEGUELDRE","startTime":1475.11,"endTime":1480.63,"body":"testing to, to recall, uh, pos point"},{"speaker":"SAMUEL DEGUELDRE","startTime":1480.63,"endTime":1481.74,"body":"of sale, the point of sale. Sorry."},{"speaker":"SAMUEL DEGUELDRE","startTime":1481.74,"endTime":1483.48,"body":"Thank you. And so you need to work"},{"speaker":"SAMUEL DEGUELDRE","startTime":1481.74,"endTime":1483.48,"body":"offline."},{"speaker":"SAMUEL DEGUELDRE","startTime":1483.81,"endTime":1488.16,"body":"Why? Um, because in some places, uh,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1483.81,"endTime":1488.16,"body":"the internet connection is spotty."},{"speaker":"SAMUEL DEGUELDRE","startTime":1488.16,"endTime":1492.69,"body":"So, for example, people, uh, they"},{"speaker":"SAMUEL DEGUELDRE","startTime":1488.16,"endTime":1492.69,"body":"work with their tablets and, uh, like,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1492.69,"endTime":1495.45,"body":"they have no Wi-Fi, or they're using"},{"speaker":"SAMUEL DEGUELDRE","startTime":1492.69,"endTime":1495.45,"body":"4G."},{"speaker":"OLIVIER COLSON","startTime":1496.05,"endTime":1497.28,"body":"And they could lose the connection."},{"speaker":"OLIVIER COLSON","startTime":1497.28,"endTime":1500.49,"body":"And so you need to need to, to keep"},{"speaker":"OLIVIER COLSON","startTime":1497.28,"endTime":1500.49,"body":"some kind of cache, uh, of what"},{"speaker":"OLIVIER COLSON","startTime":1500.49,"endTime":1502.41,"body":"they're doing so that you can"},{"speaker":"OLIVIER COLSON","startTime":1500.49,"endTime":1502.41,"body":"resynchronize with the server"},{"speaker":"OLIVIER COLSON","startTime":1502.68,"endTime":1503.25,"body":"afterwards."},{"speaker":"SAMUEL DEGUELDRE","startTime":1503.25,"endTime":1507.54,"body":"Yeah. And so we load all of the"},{"speaker":"SAMUEL DEGUELDRE","startTime":1507.84,"endTime":1513.51,"body":"in the browser, uh, in the background"},{"speaker":"SAMUEL DEGUELDRE","startTime":1507.84,"endTime":1513.51,"body":", and the, the issue that was reported"},{"speaker":"SAMUEL DEGUELDRE","startTime":1513.51,"endTime":1517.23,"body":"is that as things were loading in the"},{"speaker":"SAMUEL DEGUELDRE","startTime":1513.51,"endTime":1517.23,"body":"background, the application became"},{"speaker":"SAMUEL DEGUELDRE","startTime":1517.23,"endTime":1518.61,"body":"more and more unresponsive."},{"speaker":"SAMUEL DEGUELDRE","startTime":1518.61,"endTime":1525.66,"body":"And I think we were in on the order of"},{"speaker":"SAMUEL DEGUELDRE","startTime":1518.61,"endTime":1525.66,"body":"100,000 or 200,000 customers and"},{"speaker":"SAMUEL DEGUELDRE","startTime":1525.66,"endTime":1531.99,"body":"products. And so I just did a simple"},{"speaker":"SAMUEL DEGUELDRE","startTime":1525.66,"endTime":1531.99,"body":"profile, and it turned out that, uh,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1531.99,"endTime":1538.08,"body":"in order to, to have performance"},{"speaker":"SAMUEL DEGUELDRE","startTime":1531.99,"endTime":1538.08,"body":"searching for partners and products,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1538.29,"endTime":1542.4,"body":"uh, we constructed a large string"},{"speaker":"SAMUEL DEGUELDRE","startTime":1538.29,"endTime":1542.4,"body":"that represented all of the partners"},{"speaker":"SAMUEL DEGUELDRE","startTime":1542.4,"endTime":1546.69,"body":"and the products, with a few, like"},{"speaker":"SAMUEL DEGUELDRE","startTime":1542.4,"endTime":1546.69,"body":"sigil inside the string to be able to"},{"speaker":"SAMUEL DEGUELDRE","startTime":1546.69,"endTime":1550.95,"body":"find which customer or which product"},{"speaker":"SAMUEL DEGUELDRE","startTime":1546.69,"endTime":1550.95,"body":"was represented by this section of the"},{"speaker":"SAMUEL DEGUELDRE","startTime":1550.95,"endTime":1556.74,"body":"string. And the reason we did that is"},{"speaker":"SAMUEL DEGUELDRE","startTime":1550.95,"endTime":1556.74,"body":"that, uh, you can use regexp to search"},{"speaker":"SAMUEL DEGUELDRE","startTime":1556.74,"endTime":1560.22,"body":"inside this huge string very, very"},{"speaker":"SAMUEL DEGUELDRE","startTime":1556.74,"endTime":1560.22,"body":"fast because regexes are they're"},{"speaker":"SAMUEL DEGUELDRE","startTime":1560.22,"endTime":1562.95,"body":"compiled by the regex engine of the"},{"speaker":"SAMUEL DEGUELDRE","startTime":1560.22,"endTime":1562.95,"body":"browser."},{"speaker":"SAMUEL DEGUELDRE","startTime":1563.28,"endTime":1564.54,"body":"And so they're really, really fast."},{"speaker":"SAMUEL DEGUELDRE","startTime":1565.08,"endTime":1569.58,"body":"And the issue is that, well, we have"},{"speaker":"SAMUEL DEGUELDRE","startTime":1565.08,"endTime":1569.58,"body":"this, all of this information about uh"},{"speaker":"SAMUEL DEGUELDRE","startTime":1569.58,"endTime":1574.08,"body":"customer, for example, it can be"},{"speaker":"SAMUEL DEGUELDRE","startTime":1569.58,"endTime":1574.08,"body":"something like 100kB with uh, their"},{"speaker":"SAMUEL DEGUELDRE","startTime":1574.08,"endTime":1576.09,"body":"name addresses, whatever."},{"speaker":"SAMUEL DEGUELDRE","startTime":1576.42,"endTime":1581.16,"body":"Um, and we're every time that we're"},{"speaker":"SAMUEL DEGUELDRE","startTime":1576.42,"endTime":1581.16,"body":"loading a new batch of partners in the"},{"speaker":"SAMUEL DEGUELDRE","startTime":1581.16,"endTime":1584.79,"body":"background, we're building this"},{"speaker":"SAMUEL DEGUELDRE","startTime":1581.16,"endTime":1584.79,"body":"string for this partner and appending"},{"speaker":"SAMUEL DEGUELDRE","startTime":1584.79,"endTime":1585.9,"body":"it to the existing string."},{"speaker":"SAMUEL DEGUELDRE","startTime":1585.9,"endTime":1591.06,"body":"And so if you know anything about,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1585.9,"endTime":1591.06,"body":"like, vectors or dynamic arrays and,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1591.06,"endTime":1593.37,"body":"in this case, strings, it's kind of"},{"speaker":"SAMUEL DEGUELDRE","startTime":1591.06,"endTime":1593.37,"body":"the same."},{"speaker":"SAMUEL DEGUELDRE","startTime":1593.37,"endTime":1595.38,"body":"We're just adding stuff at the end."},{"speaker":"SAMUEL DEGUELDRE","startTime":1595.38,"endTime":1599.1,"body":"And to do that you have to deallocate"},{"speaker":"SAMUEL DEGUELDRE","startTime":1595.38,"endTime":1599.1,"body":"the memory and allocate new memory"},{"speaker":"SAMUEL DEGUELDRE","startTime":1599.1,"endTime":1600.96,"body":"where this new data will fit."},{"speaker":"SAMUEL DEGUELDRE","startTime":1600.96,"endTime":1603.33,"body":"And we have 100,000 partners."},{"speaker":"SAMUEL DEGUELDRE","startTime":1603.33,"endTime":1605.64,"body":"So the string is hundreds of Meg..."},{"speaker":"SAMUEL DEGUELDRE","startTime":1605.64,"endTime":1606.69,"body":"Well, not hundreds."},{"speaker":"SAMUEL DEGUELDRE","startTime":1606.69,"endTime":1608.55,"body":"It was around ten megabytes for one"},{"speaker":"SAMUEL DEGUELDRE","startTime":1606.69,"endTime":1608.55,"body":"string."},{"speaker":"OLIVIER COLSON","startTime":1609.12,"endTime":1611.67,"body":"A string taking megabytes is already"},{"speaker":"SAMUEL DEGUELDRE","startTime":1611.67,"endTime":1612.75,"body":"Yeah, yeah."},{"speaker":"SAMUEL DEGUELDRE","startTime":1612.75,"endTime":1616.38,"body":"And so it's just, uh, as I was"},{"speaker":"SAMUEL DEGUELDRE","startTime":1612.75,"endTime":1616.38,"body":"saying, it's a pretty dumb issue,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1616.38,"endTime":1620.49,"body":"right? If you know that you have an"},{"speaker":"SAMUEL DEGUELDRE","startTime":1616.38,"endTime":1620.49,"body":"object that needs to grow a lot, then"},{"speaker":"SAMUEL DEGUELDRE","startTime":1620.49,"endTime":1623.28,"body":"instead of using something like a"},{"speaker":"SAMUEL DEGUELDRE","startTime":1620.49,"endTime":1623.28,"body":"string that you have to reallocate"},{"speaker":"SAMUEL DEGUELDRE","startTime":1623.28,"endTime":1626.37,"body":"every time, it would make more sense"},{"speaker":"SAMUEL DEGUELDRE","startTime":1623.28,"endTime":1626.37,"body":"to have a data structure that's"},{"speaker":"SAMUEL DEGUELDRE","startTime":1626.37,"endTime":1628.98,"body":"actually appropriate to grow"},{"speaker":"SAMUEL DEGUELDRE","startTime":1626.37,"endTime":1628.98,"body":"progressively from the end."},{"speaker":"SAMUEL DEGUELDRE","startTime":1628.98,"endTime":1633.6,"body":"And so, what I did is I simply split"},{"speaker":"SAMUEL DEGUELDRE","startTime":1628.98,"endTime":1633.6,"body":"up the the string into chunks."},{"speaker":"SAMUEL DEGUELDRE","startTime":1633.6,"endTime":1637.74,"body":"So instead of having one huge string"},{"speaker":"SAMUEL DEGUELDRE","startTime":1633.6,"endTime":1637.74,"body":"for 100,000 partners, for every block"},{"speaker":"SAMUEL DEGUELDRE","startTime":1637.74,"endTime":1640.92,"body":"of 1000 partners ID, we have one"},{"speaker":"SAMUEL DEGUELDRE","startTime":1637.74,"endTime":1640.92,"body":"string."},{"speaker":"SAMUEL DEGUELDRE","startTime":1641.31,"endTime":1644.19,"body":"And so that means that we can still"},{"speaker":"SAMUEL DEGUELDRE","startTime":1641.31,"endTime":1644.19,"body":"get most of the performance benefit"},{"speaker":"SAMUEL DEGUELDRE","startTime":1644.19,"endTime":1647.49,"body":"from regex, where we just, uh, since"},{"speaker":"SAMUEL DEGUELDRE","startTime":1644.19,"endTime":1647.49,"body":"..."},{"speaker":"OLIVIER COLSON","startTime":1647.64,"endTime":1649.71,"body":"You still need to iterate on those,"},{"speaker":"OLIVIER COLSON","startTime":1649.71,"endTime":1651.39,"body":"But since it's really fast, you don't"},{"speaker":"OLIVIER COLSON","startTime":1649.71,"endTime":1651.39,"body":"care."},{"speaker":"SAMUEL DEGUELDRE","startTime":1651.84,"endTime":1655.81,"body":"Yeah. So if you have 100,000 partners,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1655.81,"endTime":1660.24,"body":"thousand partners, you have to loop"},{"speaker":"SAMUEL DEGUELDRE","startTime":1655.81,"endTime":1660.24,"body":"100 times so you don't lose much time"},{"speaker":"SAMUEL DEGUELDRE","startTime":1660.24,"endTime":1663.66,"body":"in this loop. And you still get the"},{"speaker":"SAMUEL DEGUELDRE","startTime":1660.24,"endTime":1663.66,"body":"benefit of regex, uh, for, for the"},{"speaker":"SAMUEL DEGUELDRE","startTime":1663.66,"endTime":1664.59,"body":"search itself."},{"speaker":"OLIVIER COLSON","startTime":1664.59,"endTime":1666.39,"body":"Okay. That's an interesting one."},{"speaker":"OLIVIER COLSON","startTime":1666.51,"endTime":1669.81,"body":"You said it was never like niche"},{"speaker":"OLIVIER COLSON","startTime":1666.51,"endTime":1669.81,"body":"things and then pretty complex ones."},{"speaker":"OLIVIER COLSON","startTime":1669.81,"endTime":1671.37,"body":"But this one, it's..."},{"speaker":"OLIVIER COLSON","startTime":1671.37,"endTime":1672.3,"body":"I mean, it's exotic."},{"speaker":"SAMUEL DEGUELDRE","startTime":1672.3,"endTime":1675.09,"body":"Yeah. Yeah, it's one of the most"},{"speaker":"SAMUEL DEGUELDRE","startTime":1675.09,"endTime":1678.3,"body":"Most of the issues that we find are"},{"speaker":"SAMUEL DEGUELDRE","startTime":1675.09,"endTime":1678.3,"body":"much, much dumber."},{"speaker":"OLIVIER COLSON","startTime":1678.3,"endTime":1683.16,"body":"Okay. Um, as a conclusion now, um,"},{"speaker":"OLIVIER COLSON","startTime":1683.16,"endTime":1688.38,"body":"someone, like wanting to become like"},{"speaker":"OLIVIER COLSON","startTime":1683.16,"endTime":1688.38,"body":"the, the, the new JS perf expert?"},{"speaker":"OLIVIER COLSON","startTime":1688.38,"endTime":1690.12,"body":"Uh, how can it do that?"},{"speaker":"OLIVIER COLSON","startTime":1690.12,"endTime":1691.65,"body":"Uh. Just trying?"},{"speaker":"SAMUEL DEGUELDRE","startTime":1691.65,"endTime":1693.63,"body":"Yeah, honestly, it's it's not black"},{"speaker":"SAMUEL DEGUELDRE","startTime":1694.32,"endTime":1697.62,"body":"Uh, like most things in software, you"},{"speaker":"SAMUEL DEGUELDRE","startTime":1694.32,"endTime":1697.62,"body":"just have to be interested, uh, do"},{"speaker":"SAMUEL DEGUELDRE","startTime":1697.62,"endTime":1699.42,"body":"some research and then just do it a"},{"speaker":"SAMUEL DEGUELDRE","startTime":1697.62,"endTime":1699.42,"body":"lot."},{"speaker":"SAMUEL DEGUELDRE","startTime":1699.9,"endTime":1701.55,"body":"You do it a lot, and then you get"},{"speaker":"SAMUEL DEGUELDRE","startTime":1699.9,"endTime":1701.55,"body":"good."},{"speaker":"SAMUEL DEGUELDRE","startTime":1702.0,"endTime":1703.89,"body":"Uh, most of the tools are pretty"},{"speaker":"SAMUEL DEGUELDRE","startTime":1702.0,"endTime":1703.89,"body":"intuitive."},{"speaker":"SAMUEL DEGUELDRE","startTime":1704.49,"endTime":1706.23,"body":"Like, especially all of the Chrome"},{"speaker":"SAMUEL DEGUELDRE","startTime":1704.49,"endTime":1706.23,"body":"dev tools."},{"speaker":"SAMUEL DEGUELDRE","startTime":1706.23,"endTime":1710.06,"body":"They're not super well documented,"},{"speaker":"SAMUEL DEGUELDRE","startTime":1706.23,"endTime":1710.06,"body":"but most of the things are, kind of"},{"speaker":"SAMUEL DEGUELDRE","startTime":1710.06,"endTime":1714.14,"body":"self-explanatory. It's just that you"},{"speaker":"SAMUEL DEGUELDRE","startTime":1710.06,"endTime":1714.14,"body":"have to like play around in the UI to"},{"speaker":"SAMUEL DEGUELDRE","startTime":1714.14,"endTime":1715.34,"body":"find all of the options."},{"speaker":"SAMUEL DEGUELDRE","startTime":1715.34,"endTime":1718.49,"body":"But once you found them, you're"},{"speaker":"SAMUEL DEGUELDRE","startTime":1715.34,"endTime":1718.49,"body":"pretty much golden."},{"speaker":"OLIVIER COLSON","startTime":1718.52,"endTime":1723.02,"body":"Mhm mhm. And anyway you've given like"},{"speaker":"OLIVIER COLSON","startTime":1723.02,"endTime":1725.36,"body":"that people can just have a look and"},{"speaker":"OLIVIER COLSON","startTime":1723.02,"endTime":1725.36,"body":"investigate themselves."},{"speaker":"OLIVIER COLSON","startTime":1725.36,"endTime":1729.02,"body":"And I'm pretty sure with that, uh,"},{"speaker":"OLIVIER COLSON","startTime":1725.36,"endTime":1729.02,"body":"they can take the first steps to"},{"speaker":"OLIVIER COLSON","startTime":1729.02,"endTime":1731.09,"body":"becoming experts in the field."},{"speaker":"OLIVIER COLSON","startTime":1731.09,"endTime":1735.23,"body":"Thank you very much for your answers"},{"speaker":"OLIVIER COLSON","startTime":1731.09,"endTime":1735.23,"body":", and see you in the next episode,"},{"speaker":"OLIVIER COLSON","startTime":1735.23,"endTime":1735.74,"body":"hopefully."},{"speaker":"SAMUEL DEGUELDRE","startTime":1735.74,"endTime":1736.79,"body":"Thank you for having me."},{"speaker":"OLIVIER COLSON","startTime":1736.79,"endTime":1738.77,"body":"And that's a wrap for this episode."},{"speaker":"OLIVIER COLSON","startTime":1738.77,"endTime":1741.26,"body":"If you learned things and would like"},{"speaker":"OLIVIER COLSON","startTime":1738.77,"endTime":1741.26,"body":"to go deeper into the JavaScript"},{"speaker":"OLIVIER COLSON","startTime":1741.29,"endTime":1745.01,"body":"topic, we already published several"},{"speaker":"OLIVIER COLSON","startTime":1741.29,"endTime":1745.01,"body":"episodes on this matter, so I suggest"},{"speaker":"OLIVIER COLSON","startTime":1745.01,"endTime":1746.09,"body":"you go listen to them."},{"speaker":"OLIVIER COLSON","startTime":1746.09,"endTime":1747.71,"body":"The links are in the description."},{"speaker":"OLIVIER COLSON","startTime":1747.71,"endTime":1749.81,"body":"On my side, I thank you for staying"},{"speaker":"OLIVIER COLSON","startTime":1747.71,"endTime":1749.81,"body":"until the end."},{"speaker":"OLIVIER COLSON","startTime":1749.81,"endTime":1751.91,"body":"Have a great day, and till next time."},{"speaker":"OLIVIER COLSON","startTime":1751.91,"endTime":1752.63,"body":"Cheers!"}]}