"5 рд╕реЗрдВрдЯ" рд╕реЙрд░реНрдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рд╡рд┐рд╖рдп рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдореЗрдВ рдореИрдВ рдЕрдкрдирд╛ рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ GNU C ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ std::sort() рдХреЛ рдУрд╡рд░рдЯреЗрдХ std::sort() рдФрд░ (рд▓рдЧрднрдЧ, рдХреЛрдИ рд╕рдЯреАрдХ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ) CppCon 2019 рдХреЗ рд╕рд╛рде "Sort Alexandrescu" рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред


рдЯрд╛рд╕реНрдХ рдХреА рд╢рд░реНрддреЗрдВ


рдХреЛрдб рдореЗрдВ ( C++ рдирд╣реАрдВ), рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА qsort() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдУрд╡рд░рд╣реЗрдб рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП std::sort() рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдИ рдмрджрддрд░ рдЫрдБрдЯрд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪрд┐рдд рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдЦрд╛рдХрд╛ рдХреЗ рдмрдЬрд╛рдп рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдмрджрд▓реЗ рдореЗрдВ, рдпрджрд┐ рдЖрдк "рд╣рд╛рдерд┐рдпреЛрдВ" рдХреЗ рдмрдЬрд╛рдп "рдЪреВрд╣реЛрдВ" рдХреЛ qsort() , рддреЛ qsort() рдХреА рд▓рд╛рдЧрдд рдХрд╛рдлреА рдмрдбрд╝реА рд╣реИ: рдЕрддрд┐рд░рд┐рдХреНрдд рдкрддрд╛ рдЕрдВрдХрдЧрдгрд┐рдд рдФрд░ рддреБрд▓рдирд┐рддреНрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХреЙрд▓ред


рдкрд░рд┐рдгрд╛рдо


рдЙрдкрд▓рдмреНрдз рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдпрд╣ рд╕рдВрдпреЛрдЬрди рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрд░реНрдереЛрдВ рдореЗрдВ рдХрдИ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬрд╝ рд╣реИ:


  • рддреБрд▓рдирд╛ рдФрд░ рдЪрд╛рд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ (рдЧрдгрдирд╛ рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП C++ рд╡рд░реНрдЧ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
  • рдорд╢реАрди рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рд╕реЗ (рдХреИрд╢ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИ)ред
  • рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдФрд░ рдЗрд╕рдХреА рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рд╕реЗред
  • SORT_THRESHOLD рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд▓рдВрдмреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдореЗрдВ, рд▓рд╛рдн 3-5% рддрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
  • рдЖрджреЗрд╢ рдпрд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЖрджреЗрд╢рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде 1.5-2-3 рдЧреБрдирд╛ рддреЗрдЬрд╝реА рддрдХред
  • рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рдХреЗрд╡рд▓ рдмрд╣реБрдд рдХрдо рджреГрд╢реНрдпреЛрдВ рдкрд░ рдорд╛рдореВрд▓реА рдиреБрдХрд╕рд╛рдиред

рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рддреЗрдЬ рдФрд░ / рдпрд╛ рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдЯрд╛рдЗрдЯреИрдирд┐рдХ рдХрд╛рдо рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдмрд░реНрджрд╛рд╢реНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред


рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреА рддреБрд▓рдирд╛ рдЯрд╛рд░рдирдЯреВрд▓, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓, SQLite рдФрд░ MySQL рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХрд╛рдореЛрд╕ рдЕрдкрдиреЗ SysBench рдХреЗ рд╕рд╛рде рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдЧреА ред


рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рдХреИрд╕реЗ рд╣реИ?


RPG18 рд╕реЗ рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ , рдЖрдВрджреНрд░реЗрдИ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рджреНрд╡рд╛рд░рд╛ рд╣рд╛рд▓ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ рдерд╛ "рд╕реНрдкреАрдб рдЗрдЬрд╝ рдЗрди рдорд╛рдЗрдВрдбреНрд╕ рдСрдл рдкреАрдкрд▓" , рдЬрд╣рд╛рдВ рд╡рд╣ рдХрд╛рдлреА рд╣рдж рддрдХ рдПрдХ рд╕рдорд╛рди рд╡рд┐рдЪрд╛рд░ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рдХреЗ рдХрд░реАрдм heap_sort рдЬрд╛рддрд╛ рд╣реИред


рдкреНрд░рджрд░реНрд╢рди рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рд▓рдВрдмрд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ (рдпрджрд┐ рдСрд▓реАрдЧрдмрд┐рди рдиреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рд░ 90 рдорд┐рдирдЯ рджрд┐рдП рд╣реЛрдВ ...), рд▓реЗрдХрд┐рди рд╕рдВрдЦреНрдпрд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВ рдмрдврд╝рддреЗ N рд╕рд╛рде рдЫрдВрдЯрдиреА рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреНрд╡рд┐рдХреЙрд░реНрдЯ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдореЗрдВ рддреНрд╡рд░рдг рдФрд░ рдЫреЛрдЯреЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдордВрджреА рдЖрджрд┐ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред


рдлрд┐рд░ рднреА, рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рдХреЗ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╡рд░реНрдгрд┐рдд рд╡рд┐рдХрд▓реНрдк рдЕрдЪрд╛рдирдХ рдПрдХ рд╕рдорд╛рди рддреНрд╡рд░рдг рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рддрдХ рдореБрдЭреЗ рдЗрд╕рдХреЗ рд╕рдорд╛рдкреНрдд рд░реВрдк рдореЗрдВ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рдХреЛ рджрд┐рдЦрд╛рдП рдЧрдП рдХреЛрдб рдХреЛ "рд▓реЗрдиреЗ рдФрд░ рддреБрд▓рдирд╛ рдХрд░рдиреЗ" рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдорд┐рд▓рд╛, рдФрд░ рд╡реАрдбрд┐рдпреЛ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдВрдХреЗрддрд┐рдХ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдмрджрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИ (рд▓рд┐рдЦреЗрдВ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкрд╛рддреЗ рд╣реИрдВ рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ)ред


рд╡реИрдЪрд╛рд░рд┐рдХ рдкрдХреНрд╖


"рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо" рдХрд╛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдФрд░ рд╡реИрдЪрд╛рд░рд┐рдХ рдкрдХреНрд╖ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:


  1. рдЧреИрд░-рдЫреЛрдЯреЗ рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рднреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде QuickSort рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
    • рд╕рдВрдХреЗрдд рдкрд░ рдкрджреЛрдВ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдвреЗрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдирд╣реАрдВред
    • рдПрдХ рд╕рд╣рд╛рдпрдХ рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ, рдордзреНрдп рдФрд░ рдЕрдВрддрд┐рдо рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
    • рд╣рдо рдЫреЛрдЯреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╕реЙрд░реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕реЗ рд╢реЗрд▓рд╕реЙрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред
    • рдмрдВрдЯрд╡рд╛рд░реЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╣рдореЗрд╢рд╛ рд╕реНрдЯреИрдХ рдкрд░ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕реНрдЯреИрдХ Log2(N) рд╕реЗ рдЕрдзрд┐рдХ рдЧрд╣рд░рд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  2. ShellSort рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрдб-рд╕реЙ рдбреЗрдЯрд╛:
    • рдкрд╛рд╕ рдХреА рдиреНрдпреВрдирддрдо рд╕рдВрдЦреНрдпрд╛ред
    • рдкрд╣рд▓реЗ рдкрд╛рд╕ рдкрд░ рдХрджрдо рдЕрд╕рдВрдмрдВрдзрд┐рдд рдЦрдВрдб рдХреЗ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рд╣рд╕рдВрдмрджреНрдз рд╣реИред
    • рдЪрд░рдг 8 рдФрд░ (рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ) 1 рдХреЗ рд╕рд╛рде рдХреБрд▓ рдХреЗрд╡рд▓ рджреЛ рдкрд╛рд╕ред
  3. ShellSort рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдХреНрд╡реЗрдХреЙрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд╛рд╕ рд╕реАрдорд╛ рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдирддреАрдЬрддрди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдиреЗ рдФрд░ рдереЛрдбрд╝реЗ рддреЗрдЬрд╝ рдкреВрд░реНрд╡-рдЫрдБрдЯрд╛рдИ рдХреЗ рдХрд╛рд░рдг рдмрдЪрдд рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдХреНрд╡рд┐рдХрд╕реЙрд░реНрдЯ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╣реИред

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рдЖрд╡реЗрджрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдк SORT_THRESHOLD рднреАрддрд░ SORT_THRESHOLD рдЪреБрдирдХрд░ 10-15% рддрдХ рд▓рдВрдмреЗ рдЕрдиреБрдХреНрд░рдореЛрдВ рдкрд░ рд▓рд╛рдн рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдХрд░реАрдм рд╣реИред
рдлрд┐рд░ рднреА, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдмреЛрдирд╕ рд╣реИ рдпрджрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдореЗрдВ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдпрджрд┐ рдЖрдк рд╕рд╕реНрддреЗ рдореЗрдВ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЫреЛрдЯреЗ SORT_THRESHOLD рд╕рд╛рде рдПрдХ рд╢рд╛рдЦрд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдкреБрдирд╢реНрдЪ
рд╡рд░реНрдгрд┐рдд рдЫрдБрдЯрд╛рдИ рд╡рд┐рдХрд▓реНрдк рдореЗрд░реЗ libmdbx рдкрд░рд┐рдпреЛрдЬрдирд╛ (ACID рдХреЗ рд╕рд╛рде рддреЗрдЬрд╝ рдПрдореНрдмреЗрдбреЗрдб рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдбреЗрдЯрд╛рдмреЗрд╕) рдХреЗ рд▓рд┐рдП "рдкреБрди: рдХрд┐рдпрд╛ рдЧрдпрд╛" рдерд╛, рдЬрд┐рд╕рдореЗрдВ рджреВрд╕рд░реЗ рджрд┐рди README рдФрд░ API рд╡рд┐рд╡рд░рдг рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдереЗ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП)ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЯрд╛рдЗрдкреЛ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдФрд░ рд╕рд▓рд╛рд╣ рдФрд░ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХрд╛ рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред рдЦреБрдж, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдХрдореА рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред

Source: https://habr.com/ru/post/hi469471/


All Articles