This Algorithm is 1,606,240% FASTER

Поделиться
HTML-код
  • Опубликовано: 5 янв 2023
  • 7 Steps it took to make an algorithm 1,606,242% faster!!!!
    Become a backend engineer. Its my favorite site
    boot.dev/?promo=PRIMEAGENYT
    This is also the best way to support me is to support yourself becoming a better backend engineer.
    David Perez
    github.com/david-a-perez
    B3NNY
    / _b_3_n_n_y_
    Bit video
    • Bit and Byte Explained...
    Code used in video
    github.com/ThePrimeagen/aoc/b...
    Twitch
    Everything is built live on twitch
    Twitch : bit.ly/3xhFO3E
    Discord: discord.gg/ThePrimeagen
    Spotify DevHour: open.spotify.com/show/4MLaDrQ...
    Editor
    All my videos are edited by Flip. Give him a follow! / flipmediaprod He is also open to do more editing, so slide deeeeeeeeep into his dms.
    Join this channel to get access to perks:
    / @theprimeagen
    Links
    Linode: linode.com/prime
    / discord
    Twitch: / theprimeagen
    Insta: / theprimeagen
    Twitter: / theprimeagen
    VimRC & i3: github.com/ThePrimeagen/.dotf...
    Keyboard 15% off bit.ly/Prime360 USE CODE PRIME360
    #coding #neovim #typescript #programming #vim #softwareengineering #codinglife #webdesign #webdevelopment #webdev #javascript #rustlang #rust #twitch #twitchstreamer #programmerhumor #codinghumor #software #softwareengineer #softwaredeveloper #softwaredevelopment
  • НаукаНаука

Комментарии • 875

  • @10e999
    @10e999 Год назад +2232

    Exactly. It's not about Rust vs C vs Cpp vs Zig.
    It's about how much you understand system programming.

    • @ThePrimeagen
      @ThePrimeagen  Год назад +294

      yayaya

    • @rutabega306
      @rutabega306 Год назад +204

      Rust vs Cpp vs C vs Zig is still an important question, but the differences are stuff like memory safety and maintainability

    • @RustedCroaker
      @RustedCroaker Год назад +55

      it's not understand of system programming. it's general understanding how a hardware works irl

    • @askeladden450
      @askeladden450 Год назад +45

      that's true for algorithms but not for data. how your data is laid out in memory is just as important as the algorithm, and some languages limit the control you have over memory allocation, which makes them unsuitable for any program that deals with large amount of data, like games, audio systems etc.

    • @seanknowles9985
      @seanknowles9985 Год назад +19

      Zig has clean simple syntax like Go with 90% of Rusts safety and are continually decreasing the margin between Rust and Zig's safety gap. It may even get to parity party soon on safety but with a much cleaner API and the entire C lib interop. I have a strong feeling Zig will take the cake within the next few years.

  • @slurpe_ee
    @slurpe_ee Год назад +958

    as a beginner developer, seeing you go from an array to bit manipulation was like watching black magic. incredible to see what we can do with these technologies and break them down to their atomic pieces.

    • @MrHaggyy
      @MrHaggyy Год назад +21

      Oh you should definetly look into bit and byte representation of several native datatypes. Even if you later code in something really high level aligning data correctly makes everything soo much faster. And some compilers will choose bitmanipulation over actual multiplication or division if you can keep something in a power of two for example.

    • @tdsdave
      @tdsdave Год назад +5

      @@MrHaggyy
      Could you not replace the mod 32(decimal) with And 011111(binary) , I can't make out from the disassembly( been a long time ) how the modulus operator is compiled. But being mod 32 the remainder of that will be the result of And 11111. Mod if compiled as a instruction using division/remainder takes longer clock cycles to execute than an And.
      At least that is how it seems to me.

    • @TheSkepticSkwerl
      @TheSkepticSkwerl Год назад +8

      But manipulation is a lot simpler than it seems. The hard part is determining where to use it. Definitely test for performance as you use it.

    • @Simmons101
      @Simmons101 11 месяцев назад +2

      It can be hard and tricky to implement, but if you can learn how to quickly go up and down in levels of abstraction, it can make all the difference.

    • @PhilfreezeCH
      @PhilfreezeCH 9 месяцев назад +2

      For anyone who is interested into these kinds of algorithms. Go look into genome matching algorithms and also in-memory processing. Both categories heavily depend on these kinds of bit manipulation algorithms to optimize known problems like searching for a exact or fuzzy match.

  • @ThePrimeagen
    @ThePrimeagen  Год назад +288

    Tell me you were surprised by using a vector to speed up instead of using a hashset but telling me i am beautiful (and liking the video)
    Slight correction.
    When I say left shift is multiplied by 10, I meant 10 in binary. Therefore it is two in decimal

    • @brightonsikarskie8372
      @brightonsikarskie8372 Год назад +8

      it did surprise me. I was always confused how a hashset was O(1) just like a vector. I didn't realize it was O(1*c) which makes wayyyy more sense. Also the bits I didn't know so thank you :)

    • @AquaEBM
      @AquaEBM Год назад +1

      SipHash 1-3 (rust collections' default hashing algorithm) is fairly slow for integer keys, so this is kinda to be expected, I am quite surprised a vec is faster though, genius move.

    • @NotBlackyy
      @NotBlackyy Год назад

      It does make sense. My mind immediately jumped to the u32 "set", as I have seen it used before :D The threading was cool, but c'mon, only 64 threads? Should've used a 128 core ;)

    • @laupetre
      @laupetre Год назад

      I have started reading the Learning Rust with Entirely Too Many Linked Lists, and it has a link to a clip of mr Bjarne S. Talking about vectors vs lists, and why one should use vectors most of the time

    • @NathanHedglin
      @NathanHedglin Год назад +2

      You're beautiful

  • @DrOptix
    @DrOptix Год назад +575

    This is really awesome because you don't just show the final kick ass solution, but also present a mental model on how to get from the naive solution to the fast one.

    • @ThePrimeagen
      @ThePrimeagen  Год назад +42

      Yayaya

    • @watynecc3309
      @watynecc3309 Год назад +24

      @@ThePrimeagen That's why you're the best waifu

    • @kuklama0706
      @kuklama0706 7 месяцев назад +2

      This is actually to increase watch depth of the video. You know the next one will be better so you keep watching.

  • @fishfpv9916
    @fishfpv9916 Год назад +823

    Really like videos going over practical algerithm optimization. I feel in school there is a lot of focus on theory and very little on how to make things run fast in the real world. Love to see more of these types of videos!

    • @josuealexandericujac7083
      @josuealexandericujac7083 Год назад +34

      fast? you mean blazingly fast?

    • @5FT6MAN
      @5FT6MAN Год назад +4

      so true...cs teachers are setting us up to fail oh well thank god for chtGPT

    • @climatechangedoesntbargain9140
      @climatechangedoesntbargain9140 Год назад +26

      Theory is important

    • @brainsniffer
      @brainsniffer Год назад +11

      I feel like we talk a lot about solving problems, and if it’s an acceptable result, that’s good enough. Most of the time, I am completely unaware that things even can be optimised this much. Blows mind.

    • @HongHaiNguyenx
      @HongHaiNguyenx Год назад +26

      How can u do optimization without knowing some basic theories?

  • @yungclowns
    @yungclowns Год назад +325

    In the (relatively common) case where there's a 14-character window with more than one duplicate, going backwards within the window allows you to find the duplicate furthest along in the input. This means you can skip ahead further in those cases. It is a good example of a 'greedy' optimization looking for the best case (a late duplicate) first.

    • @nimmidev9122
      @nimmidev9122 Год назад +3

      But what is the difference between finding the duplicate from back to front first or from front to back? You can skip ahead either way, right? Or am i missing something (which is likely because its 4AM)?

    • @TheJocadasa
      @TheJocadasa Год назад +51

      ​@@nimmidev9122 Consider the example "oabcaefghijlml...".
      Looking at the first window, 'oAbcAefghijLmL'. If we check from the front, once we encounter the second 'A', we will start the next window after the first occurrence of that character, skipping 1 window. But, if we check from the back, once we find the second (right-to-left) 'L', we will start the next window before the second occurrence of that character, skipping 10 windows.
      Since we are predictably accessing only 14 bytes at a time, prefetching and, by extension, reading backwards should not be an issue. On average, we will end up skipping more windows going backwards.

    • @koktszfung
      @koktszfung Год назад +26

      ​@@nimmidev9122 try the easiest case of "aaaaa aaaaa aaaa...", if you go from the front, you can't skip ahead, if you go from the back, you can skip ahead, so they are clearly different. But I don't know if there are any case where going from the front is beneficial

    • @nimmidev9122
      @nimmidev9122 Год назад +8

      @@TheJocadasa Yee, makes much more sense now. Idk what i was thinking. Should probably stop watching such content in the middle of the night 😅 Thanks for the explanation.

    • @David-id6jw
      @David-id6jw Год назад +2

      But what if you have abcdefghijklman? The first duplicate is the second 'a' in the 14th position, but the first unique sequence is the b-n run. If you skip to the second 'a', you miss that entire sequence. Or if you want more than one duplicate, change the 'c' to a 'b' and add an 'o' at the end (abbdefghijklmano). Now the correct sequence is b-o. Either way, it feels like it would miss correct solutions.

  • @brendanwenzel
    @brendanwenzel Год назад +107

    More of this is needed! I never knew I needed to know this stuff. Best part of RUclips is getting mentored by a senior dev without having to be in the same office!

    • @yt-sh
      @yt-sh Год назад +3

      can you recommend some other senior devs on youtube who teach good concepts...

    • @softwareamedida
      @softwareamedida 11 месяцев назад

      Awesome way of thinking!!

  • @ExpertOfNil
    @ExpertOfNil Год назад +10

    Awesome video, thank you! I love it when you dive into the lower-level aspects of programming. Also a nice reminder that approximations can obfuscate significant differences.

  • @BreakbeatNightmare
    @BreakbeatNightmare Год назад +7

    More videos like this please! Love the deep dive into blazingly fast computer science topics

  • @tagon35
    @tagon35 Год назад +4

    Love this content. Really cool and even though I haven't looked at some of the concepts for a while, i can tell you've got fundamental knowledge to bank on. Can't wait to see more!

  • @anonymmc2764
    @anonymmc2764 Год назад +3

    Tbh this might be my favorite video of you so far. Very well explained, hats off to you! Also congratz to David for the solution, very clever stuff!

  • @ryandevenney8878
    @ryandevenney8878 Год назад +1

    Long time fan and this is my favorite video I’ve seen from you, more of this please!!

  • @PanduPoluan
    @PanduPoluan Год назад +155

    And a note of caution: Although yes the performance increases significantly, the more optimised it becomes, the more specialised and hard to maintain it will also be.
    For the purposes of the Advent of Code challenge, it's perfectly suitable.
    However for daily development, the tradeoffs need to be considered really carefully.
    Finally, before going down the rabbit hole of extreme optimisation, don't forget to *profile your code first* ! You don't want to spend an inordinate amount of time hyper-optimizing a portion of your code that only affects 1% of total execution time. Find pieces of code that affects 10% or more of execution time and focus your efforts there first.

    • @joaobibiano
      @joaobibiano Год назад +8

      You hit the nail on the head

    • @itellyouforfree7238
      @itellyouforfree7238 11 месяцев назад

      this mindset is why today we need 500MB to install a shitty app on a phone. back when resources were scarse, it was people job to come up with clever optimizations and techniques. nowadays people are just lazy and hide behind the "premature optimization" bullshit

    • @itellyouforfree7238
      @itellyouforfree7238 11 месяцев назад +6

      for a task of the sort as presented in the video, there is NO REASON AT ALL to stick with the "simple" solution. the clever algorithm reminds of en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm and is something any decent programmer is supposed to understand easily (possibly with introductory comments to explain some details). the best practice would be to code the optimized algorithm and unittest it against the simple reference solution for correctness.

    • @Quazgaa
      @Quazgaa 9 месяцев назад

      This sort of mewling adds nothing. "Be sure to check whether the floor is dirty before mopping the floor or else it will be a waste of time" is not the brilliant insight you want it to be. What's really going on is that people like you are often coming from a corporate managerial sort of mindset where you want all your cogs to churn out the most uniformly basic code humanly possible with no intelligent or individualized thought given to things like engineering or efficiency, but saying that out loud in so many words doesn't sound very sexy so instead you go around offering your contempt for people who enjoy the prospect of writing better code as if it is some sort of counter-intuitively enlightened insight you have descended from the heavens to grace us with, but it is no such thing.

    • @NuclearAmouri
      @NuclearAmouri 6 месяцев назад

      This reminds me of the FISR algorithm in Quake 3 that enabled it to run blazingly fast. That was a beautiful abomination peice of code.
      I wonder whether there are tools that calculate which of your functions take the most overall time.

  • @massimilianocadeddu2351
    @massimilianocadeddu2351 Год назад +15

    man you just say "blazingly fast" and i automatically click the like button.

    • @rutabega306
      @rutabega306 Год назад

      omg i just realized i did that too

  • @Green_44_
    @Green_44_ Год назад

    This is the kind of breakdown I’ve been looking for!! Thank you and your family for this content 😅

  • @jonathangodar4239
    @jonathangodar4239 Год назад

    Loved the format of this video, it was explained so nicely and very easy to follow! Ty

  • @ChillAutos
    @ChillAutos Год назад

    This is the best content on RUclips. I'm about to do your algo course on front-end masters, cant wait.

  • @darkfire2703
    @darkfire2703 Год назад +10

    Nice explanation! I pretty much went for full speed with no regards for readability / maintainability with this AoC (using rust ofc lol). I managed to get my day 6 solution down to about 4 microseconds on one of the discord callenge bots and I had a rather similar approach to you. The performance on the bot was a bit flakey, but some guy had it down to 2us on the bot which was what I got locally on my ryzen 7 2700x

  • @alexandersemionov5790
    @alexandersemionov5790 Год назад +32

    I just had my imposter syndrome gone, and then I watched this video. Damn it!
    Great video, a lot of small details and bits of information. Being a nerd is a lot of fun. Thanks ;)

  • @Nintron
    @Nintron Год назад +10

    This deep dive into optimization was fantastic! Keep up the great content Prime.

  • @zzzurreal5370
    @zzzurreal5370 Год назад +1

    Thank you . Great content. I’m not very proficient with material related to any STEM type of work but I was very interested in this video

  • @LeandroCoutinho
    @LeandroCoutinho Год назад +2

    This was extremely useful!
    Please more of this when you can. Lots of Advent of Code days to play with xD

  • @PauloMiello
    @PauloMiello Год назад

    Honestly this was such a great video congrats and thanks!

  • @daltonyon
    @daltonyon Год назад +16

    Amazing, I really love this type of content and inspire me to always thinking about performance

    • @ThePrimeagen
      @ThePrimeagen  Год назад +3

      my man! i forgot to say thanks for the comment.
      I like making these videos because its fun!

    • @daltonyon
      @daltonyon Год назад +1

      @@ThePrimeagen Anytime!! I'm waiting for more videos like that!!!

  • @scottiedoesno
    @scottiedoesno Год назад +1

    I watched this all unfold on twitch but love having the video here to review. As someone that didn't get a formal education in CS, this low level stuff is so helpful to be able to return to.

  • @frroossst4267
    @frroossst4267 Год назад +4

    I'd love more of these code optimization videos, like okay maybe we're not using these techniques and optimizations everyday but so much fun to nerd out about them

  • @wades39
    @wades39 Год назад +27

    I'd really love to see more videos like this about how crazy optimization can be. It was really intriguing to see how much overhead there is in what seems like the best approach, and how quickly a solution can run if you remove all of that.

  • @GameCyborgCh
    @GameCyborgCh 2 месяца назад +3

    good thing it only did it for 11.9 milli seconds because you'd have a pretty hard time keeping your CPU fed at 617GB/s

  • @simonfarre4907
    @simonfarre4907 Год назад +7

    The stack allocated array and the vector array both have cache locality benefits due to them _both_ being contiguous. The difference is the vector is making a syscall (potentially) to get memory off of the heap. You could reuse the vector after an iteration and you could speed up that variant some. The stack allocated array, gets further cache locality, since you don't even need the first fetch of a cache line - its already in the cache.
    But both have the benefits of spatial and temporal locality.

  • @aleclowry7654
    @aleclowry7654 Год назад +5

    “Binary ten thousand” is a phrase that makes be very uncomfortable. Lol

  • @boggledeggnoggler5472
    @boggledeggnoggler5472 Год назад

    Really cool video, Prime. Learned a lot. Ty!

  • @hk_labs
    @hk_labs Год назад

    I love this type of content.

  • @uwumarie
    @uwumarie Год назад

    i really enjoyed this video. I would love to see more of these

  • @arjanbal3972
    @arjanbal3972 Год назад +196

    It's not mentioned, so one way to split the problem for multiple threads, is to divide the string into 64 pieces and ask each thread to solve one piece. You would also need to extend the boundaries of each piece by 14 (maybe 13?) characters on one side so that you can catch 14 size windows that are in multiple pieces. Report the min index from all threads as the final answer.

    • @daedalus_00
      @daedalus_00 Год назад +30

      That would parallelize the list, but has 1 minor issue. We are looking for the first instance of a unique string, and one of the threads could find a unique string later in the sequence before the threads looking through the beginning of the sequence found the first unique string. Maybe, set up a queue for the threads. There are different ways to do so, and in this instance, you could set up two variables.
      queue_end = total_string_length - window length
      queue_value = 0
      A thread would take a window with its starting position at queue_value and increment queue_value by one, so that the next thread would take the next window, and so on, until one of the threads found a unique sequence or queue_value reaches queue_end

    • @LtdJorge
      @LtdJorge Год назад +12

      ​@@daedalus_00just do one window per thread. Mark the order of the threads and return the lowest occurrence that no windows to complete before it.

    • @loam
      @loam Год назад +29

      @@LtdJorge And that all will be slower, because threads in programming language are abstractions, that involve allocation lots of memory and creating bunch of stuff, but in the fastest solution in the video there's direct use of simd instructions of the processor, which is on the whole another level

    • @arjanbal3972
      @arjanbal3972 Год назад +11

      @@daedalus_00 Every thread will return the index where it found the first unique string. This index is the index in the original string and not the smaller piece. So we can take the minimum of the indexes returned by all the threads at the end as the final answer.

    • @arjanbal3972
      @arjanbal3972 Год назад +9

      @@loam Multi threading works along with SIMD. The function that solves each part of the whole string is exactly the same as the one that solves the entire string with SIMD alone.
      If the input is large enough, the multi threading optimization can be taken a step further by using GPUs and distributed systems. Both optimizations have their pros and cons.

  • @minecraftfan9866
    @minecraftfan9866 Год назад +3

    My dad makingan algorithm to save 2 dollars at the mall

  • @IstyManame
    @IstyManame Год назад

    I have 0 understanding of wtf are you doing but i'm enjoying this so much for some reason, great vid!

  • @BobBeatski71
    @BobBeatski71 10 месяцев назад

    I'm going to need to re-watch this a few times to get my head around those improvements. 😀

  • @iamtheV0RTEX
    @iamtheV0RTEX Год назад +40

    @9:40 You don't actually have to collect up all the elements in the iterator for this! In Rust, if an iterator implements DoubleEndedIterator then it can iterate in reverse. std::slice::iter implements this trait, so calling any of the "r" iterator methods will just start counting from the end instead of from the start.

    • @masondeross
      @masondeross 10 месяцев назад

      The assembly suggests that optimization is being applied by the compiler, since it is already iterating in reverse (over completely unrolled loops). I might be misunderstanding you: are you saying there are more things that don't need iterated (from your first sentence), and the second sentence about reverse iterator was a separate note? I don't use Rust, so "collect up all the elements in the iterator" might have a Rust technical/idiomatic meaning that I am missing.

  • @guysherman
    @guysherman Год назад +16

    Also worth noting that reverse iterators in rust don’t first go forwards, they rely on double-ended iterators, which for things like slices and vectors can start from the end

    • @ThePrimeagen
      @ThePrimeagen  Год назад +15

      That's only sometimes true. You just have to make sure you have a data structure with a known size.

  • @micalevisk
    @micalevisk Год назад

    thank you for this blazing fast series.

  • @johnmccarty6989
    @johnmccarty6989 Год назад +1

    I actually look forward to watching your videos... something rare for me on youtube nowadays

  • @JosephHenryDrawing
    @JosephHenryDrawing Год назад

    this is super interesting, upload more content like that!

  • @nickadams2361
    @nickadams2361 Год назад

    Great stuff, a lot of fun stuff happens at the bit and byte level

  • @kevindication
    @kevindication Год назад

    Hey man I’ve been really enjoying your content. I’ve been developing since 1994 and just came across your channel and have spent quite a few hours listening to you. Especially enjoying the friendly controversy with Theo. Ha! Also, awesome stache. Keep on keepin on.

  • @marcotinacci5718
    @marcotinacci5718 Год назад +1

    David's version is a clever use of the Boyer-Moore heuristic of good suffix for string pattern matching

  • @filipebraganca2558
    @filipebraganca2558 Год назад

    Wow! That one I'll need to reawatch a bunch of times to get what's happening on those improvements.

  • @RHCPhooligan
    @RHCPhooligan Год назад

    More technical videos on algorithms. This was fantastic

  • @JerryThings
    @JerryThings Год назад +5

    I just started learning about hash tables, and immediately saw incredible performance boost. I would have never imagined that an array or a vector could do the trick

    • @Winnetou17
      @Winnetou17 Год назад +1

      If you can use arrays, they are always the fastest

  • @rterminatu
    @rterminatu Год назад +2

    This video: A+ I really enjoyed seeing some interesting optimisation techniques and in Rust which I am currently learning. Looking forward to some more [amazingly fast] optimisation algorithms and techniques 😁 and in Rust

  • @rocamonde
    @rocamonde 7 месяцев назад +2

    I think a step you missed in your explanation that would make the approach more clarifying is to mention explicitly that you want to use each bit to represent whether a certain character has been seen, and that you use the character's ordinal representation modulo 32 to determine the index of the bit this information is stored in. I think it's worth remarking that you can only do this because all the characters in your input are adjacent in their ordinals and there is less than 32 of them (or else you'd get position clashes).

  • @superchillh3o
    @superchillh3o Год назад

    savage. went from web dev to game dev in 7 steps. blazingly fast indeed, ty for sharing sir!

  • @seikatsu_ki
    @seikatsu_ki Год назад

    The greatest video I ever seen in RUclips, Well Done Captain!

  • @white-bunny
    @white-bunny Год назад +5

    6:33 That is NOT the Logical AND Operator (which is &&) but actually the Bitwise AND Operator (&).
    Great video! I learnt a few things here!

  • @vantageous9217
    @vantageous9217 Год назад

    This was cool! More content like this please.

  • @Starckoo
    @Starckoo Год назад +1

    Appreciate you King 👑

  • @bionh
    @bionh 6 месяцев назад

    Thanks for the awesome content! Minor quibble: left shift always increases by the base, in binary that’s 2, not 10, it just looks like you multiply by 10 because the only digits in the numbers are 1 and 0

  • @hassan7569
    @hassan7569 8 месяцев назад +1

    3:51 you get cache locality with vectors too, it's more about accessing the heap which takes longer than accessing on the stack since everything is known compile time as opposed to having to look up the page (might not or might not be in the TLB), deferencing, etc.

  • @abomidog
    @abomidog Год назад +1

    As a new programmer, and an aspiring front end web dev and indie game dev, I don't understand a single fucking thing you're talking about, but you get me excited to learn.
    But uh...that really was blazingly fast. Maybe I'll change career paths.
    👁️ 👄 👁️

  • @joaomachado9105
    @joaomachado9105 Год назад

    love this blazingly fast themed videos 😂

  • @Yupppi
    @Yupppi 4 месяца назад

    I love this style of rust. It looks pretty confusing at first sight but it's much better than for loops with random looking operations. The algorithms kick ass. And the browsing through at low level was pretty neat as well. It's pretty wild to consider how a human would just look at the 15th value and say "I've seen that already" instead of comparing all of them individually. Despite being pretty slow at some things, human brain just keeps amazing with all its optimizations.
    The Perez algorithm was really cool, I only recently saw it explained somewhere but I didn't understand it originally nor did I remember it. What surprises me is that it isn't part of standard algorithms.

  • @alexIVMKD
    @alexIVMKD Год назад

    Good content Prime, amazing stuff

  • @oblivion_2852
    @oblivion_2852 Год назад +9

    I like the comments about the order of hashing. I think in university alot of the time they fail to mention the constants in the complexity conversation and you often end up with people always thinking hashmaps and sets being the fastest completely unaware of the cost of hashing and the common list iterator for collisions.

    • @ThePrimeagen
      @ThePrimeagen  Год назад

      When I went to university, hash sets didn't even have linked lists inside of containers. We actually used linear and exponential back off to determine it's insertion location.
      It's a neat improvement to how much space you need for a set, and it also seems pretty fun to implement.

    • @oblivion_2852
      @oblivion_2852 Год назад

      @@ThePrimeagen there's a cpp con lecture about googles flat hashmap implementation I watched years ago that was pretty interesting in terms of the decisions they made with writing a faster implementation. One of their optimizations was to use no pointers at all so once the hash gave an address you would just iterate across the key value pairs till you found your equality. On average you wouldn't need to iterate across many elements.

    • @TehKarmalizer
      @TehKarmalizer Год назад +1

      Implementation details matter. It’s important to have a rough idea how data structures work to understand the performance implications.

  • @Jovanovic91
    @Jovanovic91 Год назад +9

    You are presenting everything with such an ease, and it is highly understandable to me, self-taught (no university degree) DevOps engineer. If you were my teacher in high school I would be probably working for NASA or Roskosmos now... Make a course related to Rust development, Rust for beginners or similar...

  • @Zzznmop
    @Zzznmop Год назад +6

    I know I’ve seen you do this many times, but I think it would be SUPER cool to see you do the setup and generation of stats/graphs for perf. The more I perf test, the more I see people are often optimizing for the wrong things

  • @sheikhrachel
    @sheikhrachel Год назад

    Ok but that's like one of the best layman breakdowns of bit manipulation I've seen

  • @fabianspecht7209
    @fabianspecht7209 Год назад

    love optimization Videos! Good one :)

  • @eula9
    @eula9 Год назад

    MORE OF THIS!!! luv u

  • @pauloffborba
    @pauloffborba Год назад

    Great content. 🙏🏻

  • @thriceborn7665
    @thriceborn7665 Год назад

    Blazingly fast, indeed. Love this channel

  • @JoshDarling
    @JoshDarling Год назад

    Oh wow thank you, this opened my eyes to much.

  • @matthewg5792
    @matthewg5792 Год назад

    this was awesome. more please

  • @brightonsikarskie8372
    @brightonsikarskie8372 Год назад

    This is amazing thank you

  • @bozhidaratanasov7800
    @bozhidaratanasov7800 Год назад +1

    Hi, love your content! Can you share your thought process behind the use of excel and how you populate the data there?

  • @adevopsguy9517
    @adevopsguy9517 Год назад

    Awesome video, this was incredibly cool

  • @equenos
    @equenos Год назад +3

    Honestly I expected to see a mind-bending mathematically motivated algo but this is still very impressive

  • @EmielvanGoor
    @EmielvanGoor Год назад +1

    I didn't understand most of it but still loved the video! Thanks!

  • @RealLordy
    @RealLordy 6 месяцев назад

    I use this bit manipulation to store a series of flags as a DWORD to keep track of e.g. user configurations in a database. Much more efficient than storing a zillion of true/false fields. Never thought about using it to compare hashes. Good one 😁

  • @john_hawley
    @john_hawley Год назад

    Yes 2023 off to a great start. These videos are the secret sauce to this channel in '23 🔥

  • @TehKarmalizer
    @TehKarmalizer Год назад +3

    The array solution is the one I would have come up with, but I think there may be a little room for improvement there, depending on what the compiler is already doing with that code.

  • @qodesmith520
    @qodesmith520 Год назад

    You make my brain hurt... in the most pleasing way possible.

  • @mariofleischmann1843
    @mariofleischmann1843 Год назад +1

    This video shows perfectly why I love writing high performant code. You get to be creative: Use your existing knowledge, e.g. the Boyer Moore algorithm for string matching, to come up with solutions for new problems. Know the internals of the underlying system to select the right data structures. All theory aside, you have to actually test and experiment. Measure something odd? Then fire up that compiler and check the assembly. It just never gets boring!

  • @fumseck
    @fumseck Год назад

    Very clever adaptation of the Boyer-Moore algorithm !

  • @mti2fw
    @mti2fw Год назад

    Nice tricks. I would appreciate a video like that but optimizing multiple network calls like an api gateway

  • @Guilherme-qk9so
    @Guilherme-qk9so Год назад

    dude that was so sick!!!

  • @loliveira
    @loliveira Год назад

    The David solution resembles the Boyer-Moore string-search algorithm. Nice video!

  • @SownJevan
    @SownJevan Год назад +7

    Another upload. You love to see it.

  • @loicgrossetete9570
    @loicgrossetete9570 Год назад

    My mental try before the video ended at the one from David a perrez, cool optimization problem :)

  • @LiliumAtratum
    @LiliumAtratum 7 месяцев назад

    The idea of iterating from the back of the window reminds me of the Boyer Moore algorithm for substring search.

  • @lamprospitsillou6325
    @lamprospitsillou6325 Год назад

    More of this please!!

  • @Dani004able
    @Dani004able 7 месяцев назад

    kind or tempting to try it in assembly now :D

  • @JacobCanote
    @JacobCanote Год назад

    Woosh. A joy to see!

  • @AlecMaly
    @AlecMaly Год назад

    Great content!!

  • @FastFSharp
    @FastFSharp Год назад +2

    Instant like for performance optimization content!!🎉

  • @matteyas
    @matteyas Год назад +1

    In Julia, the naïve solution (using Sets and moving window just +1) runs in 7-8ms and the fast solution in 7-8µs on chars, or ~3µs if the input is already bit states. (Didn't bother doing a threaded version.)

  • @nikensss
    @nikensss Год назад

    Wow, amazing stuff. I love this type of content.

  • @alangamer50
    @alangamer50 5 месяцев назад

    I love the pipeline from 3 line solution to x86 assembly

  • @aflous
    @aflous Год назад

    Wow this one was excellent!

  • @craigsutton5660
    @craigsutton5660 3 месяца назад

    Understood nothing Prime just said, but somehow I still loved it and watched the whole video... :)

  • @anmolsharma4049
    @anmolsharma4049 Год назад +43

    Your understanding of concepts always amazes me. I just got off learning JavaScript and now learning c++ and data structures for job placement but my true goal is to be like you. Have a deep knowledge of code and write blazingly fast solutions.

    • @codesymphony
      @codesymphony Год назад +7

      blazingly fast is fun, but it's really all not that important in the workforce

    • @epicgameryt4052
      @epicgameryt4052 Год назад +7

      @@codesymphony it depends on who you work for. in my job having to process 50+ million records does require inner knowledge to deliver better experiences

    • @earthling_parth
      @earthling_parth Год назад +7

      @@epicgameryt4052 Correction to symphony's comment: *not that important in the majority of the workforce.

    • @TehKarmalizer
      @TehKarmalizer Год назад +2

      @@earthling_parth not sure I agree. The fact that front end developers have a reputation for being less educated on CS fundamentals doesn’t excuse the utility of knowing them.

    • @PatalJunior
      @PatalJunior Год назад +2

      @@TehKarmalizer Games is a great example, programmers used to rely on fast and optimized code to the game even run, nowadays it seems that it as shifted and more and more optimized garbage shows up every day.

  • @1XXXJoker
    @1XXXJoker Год назад +5

    Nice video
    Quick feedback, i think the explanation at 7:05 is a bit misleading as in in this case with the 0u32 as filter XOR is like a toggle. For me it sounded like you said XOR itself is like a toggle

    • @ThePrimeagen
      @ThePrimeagen  Год назад +6

      i explained everything i could in less than 1 minute :)
      i can only do so much in so little time