рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдореЗрдВ, рдкрд╣рд▓реЗ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, LZ_decompress_fast рдлрд╝рдВрдХреНрд╢рди рдЕрдХреНрд╕рд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдпрд╣ рдкреНрд░рд╢реНрди рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдШрдЯрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЪреБрдирдиреЗ рдкрд░ рдкреВрд░реЗ рдЕрдзреНрдпрдпрди рдХрд╛ рдХрд╛рд░рдг рдмрди рдЧрдпрд╛ред рдпрд╣рд╛рдБ рдореИрдВ рдкреВрд░реЗ рдЕрдзреНрдпрдпрди рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рд▓рдШреБ рд╕рдВрд╕реНрдХрд░рдг рд╣рд╛рдЗрдЕрд▓реИрдб ++ рд╕рд╛рдЗрдмреЗрд░рд┐рдпрд╛ рдкрд░ рдореЗрд░реА
рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
ClickHouse рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди ClickHouse рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ - CPU рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдиреНрдпреВрдирддрдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдЧрдгрдирд╛рдПрдВ рдЬреЛ рдХреБрдЫ рд╕рдордп рд▓реЗ рд╕рдХрддреА рд╣реИрдВ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИрдВ, рдФрд░ рдЕрдиреБрд░реЛрдз рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдлрд┐рд░ рдпрд╣ рд░рд┐рд▓реАрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред

рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ - LZ4 рдЕрдирд▓реЛрдбрд┐рдВрдЧ рдПрдХ рдЕрдбрд╝рдЪрди рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ LZ4 рдПрдХ
рдмрд╣реБрдд рд╣реА рд╣рд▓реНрдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ : рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрдкреАрдбрд╝рди рджрд░, рдЖрдорддреМрд░ рдкрд░ 1 рд╕реЗ 3 рдЬреАрдмреА / рдПрд╕ рдкреНрд░рддрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рддрдХ рд╣реЛрддреА рд╣реИред рдпрд╣ рдбрд┐рд╕реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреА рдЧрддрд┐ рд╕реЗ рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рд╕рднреА рдЙрдкрд▓рдмреНрдз рдЧреБрдард▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕рднреА рднреМрддрд┐рдХ рдЧреБрдард▓реА рдореЗрдВ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдмрд┐рдВрджреБ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдбрд┐рд╕реНрдХ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдВрдкреАрдбрд╝рд┐рдд рджрд░ рдЕрд╕рдореНрдкреАрдбрд┐рдд рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рджреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ, рддреЛ рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдбрд┐рд╕реНрдХ рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рд╕реАрдкреАрдпреВ рдХреА рдЦрдкрдд рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ: LZ4 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдкреАрдбрд╝рди рдХрд╛рдо рдХреА рдорд╛рддреНрд░рд╛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рд▓рдЧрднрдЧ рдЖрдиреБрдкрд╛рддрд┐рдХ рд╣реИред
рджреВрд╕рд░реЗ, рдЕрдЧрд░ рдХреИрд╢ рдореЗрдВ рдбреЗрдЯрд╛ рд╣реИ рддреЛ рдбрд┐рд╕реНрдХ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреЗрдЬ рдХреИрд╢ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдХреЙрд▓рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ, рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реИ рдХрд┐ рд╕рднреА рдХреЙрд▓рдо рдЗрд╕рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕реАрдкреАрдпреВ рд▓реЛрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдПрд▓рдЬреЗрдб 4, рдЕрдХреНрд╕рд░ рдПрдХ рдЕрдбрд╝рдЪрди рд╣реИред
рдЗрд╕рд▓рд┐рдП рджреЛ рдФрд░ рд╕рд╡рд╛рд▓ред рдпрджрд┐ рдбреЗрдЯрд╛ рд╕рдВрдкреАрдбрд╝рди "рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ", рддреЛ рд╢рд╛рдпрдж рдЙрдиреНрд╣реЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рдВрдХреБрдЪрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдзрд╛рд░рдгрд╛ рдирд┐рд░рд░реНрдердХ рд╣реИред рд╣рд╛рд▓ рд╣реА рдореЗрдВ ClickHouse рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдбреЗрдЯрд╛ рд╕рдВрдкреАрдбрд╝рди рд╡рд┐рдХрд▓реНрдкреЛрдВ - LZ4 рдФрд░
Zstandard рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ LZ4 рд╣реИред Zstandard рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдХреЗ, рдЖрдк рд╕рдВрдкреАрдбрд╝рди рдХреЛ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рдФрд░ рдзреАрдорд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рд╛рд▓ рд╣реА рддрдХ рд╕рдВрдкреАрдбрд╝рди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдерд╛ - LZ4 рдХреЛ рдПрдХ рдЙрдЪрд┐рдд рдиреНрдпреВрдирддрдо рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ LZ4 рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВред :)
рд▓реЗрдХрд┐рди рд╣рд╛рд▓ рд╣реА рдореЗрдВ, ClickHouse рдЕрдВрдЧреНрд░реЗрдЬреА рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ
рдЪреИрдЯ рдЪреИрдЯ рдореЗрдВ рдПрдХ рд░рд╣рд╕реНрдпрдордп рдЕрдЬрдирдмреА рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдЬрд┐рд╕рдиреЗ рдХрд╣рд╛ рдХрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдПрдХ рдмрд╣реБрдд рддреЗрдЬрд╝ рдбрд┐рд╕реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо (NVMe SSD) рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рд╕рдВрдкреАрдбрд╝рди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ - рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ рдХрд┐ рдРрд╕реА рдХреЛрдИ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдХреБрдЫ рджрд┐рдиреЛрдВ рдмрд╛рдж рд╣рдореЗрдВ рдПрдХ
рдкреВрд▓ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдорд┐рд▓реА, рдЬреЛ
none
рдХрдореНрдкреНрд░реЗрд╢рди рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ
none
рдХрд░рддреА рд╣реИред рдореИрдВрдиреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ - рдЗрд╕рд╕реЗ рдХрд┐рддрдиреА рдорджрдж рдорд┐рд▓реА, рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдХреИрд╕реЗ рдЧрддрд┐ рдорд┐рд▓реАред рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдиреЗ рдХрд╣рд╛ рдХрд┐ рдпрд╣ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдмреЗрдХрд╛рд░ рд╣реЛ рдЧрдИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд┐рдирд╛ рд╕рдВрдкреАрдбрд╝рди рдХреЗ рдбреЗрдЯрд╛ рдиреЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рд▓реЗрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред
рджреВрд╕рд░рд╛ рд╕рд╡рд╛рд▓ рдЬреЛ рдЙрдарддрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ: рдЕрдЧрд░ рдХреЛрдИ рдХреИрд╢ рд╣реИ, рддреЛ рдЙрд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдпрд╣ рдЕрдиреБрдорддрд┐ рд╣реИ - рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд┐рдШрдЯрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдФрд░ ClickHouse рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХреИрд╢ рд╣реИ -
рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдХреИрд╢ ред рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдХрдо рджрдХреНрд╖рддрд╛ рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░реИрдо рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрдпрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЫреЛрдЯреЗ, рд▓рдЧрд╛рддрд╛рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ рд╣реА рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░: рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдзрд┐рдорд╛рдирддрдГ рд╣рдореЗрд╢рд╛ред рд╣рдореЗрд╢рд╛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рдВрдХреБрдЪрд┐рдд рдбрд┐рд╕реНрдХ рдкрд░ рдЬрд▓рд╛рдПрдВред рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╕рдВрдкреНрд░реЗрд╖рдг рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░рд┐рдд рд╣реЛрдирд╛ред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдбреЗрдЯрд╛ рдХреЗрдВрджреНрд░ рдХреЗ рднреАрддрд░ рдУрд╡рд░рдмрд╕реНрдХреНрд░рд┐рдкреНрд╢рди рдХрд┐рдП рдмрд┐рдирд╛ 10-рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рдбреЗрдЯрд╛ рдХреЗрдВрджреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдкреАрдбрд╝рди рдХреЗ рдмрд┐рдирд╛ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдкрд░ рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрдкреАрдбрд╝рди рдХреЛ рдЙрдЪрд┐рдд рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреНрдпреЛрдВ LZ4?
LZ4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рдХреНрдпрд╛ рдХреБрдЫ рдЖрд╕рд╛рди рднреА рдЪреБрдирдирд╛ рд╕рдВрднрд╡ рд╣реИ? рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдпрд╣ рд╕рд╣реА рдФрд░ рдЙрдкрдпреЛрдЧреА рд╣реИред рд▓реЗрдХрд┐рди рдЖрдЗрдП рдкрд╣рд▓реЗ рджреЗрдЦреЗрдВ рдХрд┐ рдПрд▓рдЬреЗрдб 4 рдПрд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд┐рд╕ рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреВрд░реНрдгрд╛рдВрдХ рдХрд╛ рдПрдХ рд╕рд░рдгреА рд╣реЛрдЧрд╛, рддреЛ рдЖрдк VarInt рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрдИ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рд╕реАрдкреАрдпреВ рдкрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛрдЧрд╛ред рджреВрд╕рд░реЗ, LZ4 рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реЗрдВрд╕рд░ рд░реАрдбрд┐рдВрдЧ рдХрд╛ рдПрдХ рдХреНрд░рдордмрджреНрдз рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ - рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдлреНрд▓реЛрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рддрдм рдЖрдк рдбреЗрд▓реНрдЯрд╛рд╕ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЖрдЧреЗ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛрдЧрд╛ред
рдпрд╣реА рд╣реИ, LZ4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдмрд╛рдЗрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдХрд┐рд╕реА рднреА рдлрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдПред рдмреЗрд╢рдХ, рдЙрд╕рдХреА рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реИ (рдиреАрдЪреЗ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХ), рдФрд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрд░реНрдерд╣реАрди рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рдЧрд▓рддреА рд╣реЛрдЧреАред рдФрд░ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐, рдЖрдВрддрд░рд┐рдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, LZ4 рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ
RLE рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдЕрдиреНрдп рдкреНрд░рд╢реНрди: LZ4 рдЧрддрд┐ рдФрд░ рд╕рдВрдкреАрдбрд╝рди рдмрд▓ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рд╕рдмрд╕реЗ рдЗрд╖реНрдЯрддрдо рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ? рдРрд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдкреЗрд░реЗрдЯреЛ рдлреНрд░рдВрдЯрд┐рдпрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЛрдИ рдЕрдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдПрдХ рд╕рдВрдХреЗрддрдХ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ рдФрд░ рджреВрд╕рд░реЛрдВ рдореЗрдВ рднреА рдмрджрддрд░ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рднреА)ред рдРрд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИрдВ рдЬреЛ рддреЗрдЬ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдо рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдРрд╕реЗ рднреА рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдзрд┐рдХ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдзреАрдореА рд╕рдВрдкреАрдбрд╝рд┐рдд рдпрд╛ рдбреАрдХрдВрдкреНрд░реЗрд╕ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, LZ4 рдПрдХ рдкрд░реЗрддреЛ рдлреНрд░рдВрдЯрд┐рдпрд░ рдирд╣реАрдВ рд╣реИред рдРрд╕реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬреЛ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣
LZTURBO рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд
рдкрд╛рд╡рдЯрдмреЛ рд╕реЗ рд╣реИ ред рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдореЗрдВ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ, рд╕рдореБрджрд╛рдп рдХреЛ encode.ru рдкрд░ рдзрдиреНрдпрд╡рд╛рдж (рдбреЗрдЯрд╛ рд╕рдВрдкреАрдбрд╝рди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдФрд░ рд▓рдЧрднрдЧ рдПрдХрдорд╛рддреНрд░ рдордВрдЪ)ред рд▓реЗрдХрд┐рди рдбреЗрд╡рд▓рдкрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╛ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдпрд╛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреИрд╕реЗ рдХреЗ рд▓рд┐рдП рд▓реЛрдЧреЛрдВ рдХреЗ рдПрдХ рд╕реАрдорд┐рдд рджрд╛рдпрд░реЗ рдореЗрдВ рджреЗрддрд╛ рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдЕрдм рддрдХ рднреБрдЧрддрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛
рдЫрд┐рдкрдХрд▓реА (рдкреВрд░реНрд╡ LZ5) рдФрд░
рдШрдирддреНрд╡ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рд╡реЗ рдХреБрдЫ рд╕рдВрдкреАрдбрд╝рди рд╕реНрддрд░ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╕рдордп LZ4 рд╕реЗ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
LZSSE рдкрд░ рднреА рдзреНрдпрд╛рди
рджреЗрдВ - рдПрдХ рдмреЗрд╣рдж рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рддред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рджреЗрдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
LZ4 рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдПрд▓рдЬреЗрдб 4 рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ LZ77 рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ: рдПрд▓ рдФрд░ рдЬреЗрдб рд▓реЗрдЦрдХреЛрдВ (рд▓реЗрдореНрдкреЗрд▓ рдФрд░ рдЬрд╝рд┐рд╡) рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ 77 - 1977 рдореЗрдВ, рдЬрдм рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдХрдИ рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ: QuickLZ, FastLZ, BriefLZ, LZF, LZO, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХрдо рд╕рдВрдкреАрдбрд╝рди рд╕реНрддрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп gzip рдФрд░ рдЬрд╝рд┐рдкред
LZ4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдореЗрдВ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рд┐рдХреЙрд░реНрдб (рдХрдорд╛рдВрдб, рдирд┐рд░реНрджреЗрд╢) рд╣реЛрддреЗ рд╣реИрдВ:
- рд╢рд╛рдмреНрджрд┐рдХ: "рдЕрдЧрд▓реЗ рдПрди рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХреЙрдкреА рдХрд░реЗрдВред"
- рдореИрдЪ (рдореИрдЪ): "рдПрди рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрджрд╛ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдСрдлрд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдШрдЯрд┐рдд рдереЗред"
рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рд╕рдВрдкреАрдбрд╝рди рд╕реЗ рдкрд╣рд▓реЗ:
Hello world Hello
рд╕рдВрдкреАрдбрд╝рди рдХреЗ рдмрд╛рдж:
literals 12 "Hello world " match 5 12
рдпрджрд┐ рд╣рдо рдПрдХ рд╕рдВрдХреБрдЪрд┐рдд рдмреНрд▓реЙрдХ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдХрд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрди рдХрдорд╛рдВрдбреНрд╕ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ, рдЕрд╕рдореНрдкреАрдбрд┐рдд рдбреЗрдЯрд╛ рдорд┐рд▓реЗрдЧрд╛ред
рд╣рдордиреЗ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рджреЗрдЦрд╛ рдХрд┐ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рд╡рд┐рдШрдЯрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдмрд┐рдВрджреБ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИ: рд╕рдВрдкреАрдбрд╝рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореИрдЪреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рдЗрдЯ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред
рд╕реНрдкрд╖реНрдЯ рдФрд░ рдХреБрдЫ рдЧреБрдгред рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрд╛рдЗрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рд╣реИ - рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд╡рд┐рдЪреНрдЫреЗрджрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рдЗрд╕рдХреА рд╕рдВрдкреВрд░реНрдгрддрд╛ рдореЗрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЕрдВрддрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдиреНрдЯреНрд░рд╛рдкреА рдХреЛрдбрд┐рдВрдЧ рд╕реЗ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
zstd LZ77 рдФрд░ рдПрдиреНрдЯреНрд░рд╛рдкреА рдХреЛрдбрд┐рдВрдЧ рдХреА рдПрдХ рд░рдЪрдирд╛ рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рдВрдкреАрдбрд╝рд┐рдд рдмреНрд▓реЙрдХ рдХрд╛ рдЖрдХрд╛рд░ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдирд╣реАрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЕрдирд▓реЛрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░реИрдо рдЦрд░реНрдЪ рди рдХрд░реЗрдВ; рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рдВрдкреАрдбрд╝рд┐рдд рдлрд╝рд╛рдЗрд▓ (рдЬрд┐рд╕рдореЗрдВ рдХрдИ рд╕рдВрдкреАрдбрд╝рд┐рдд рдмреНрд▓реЙрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ) рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЕрднрд┐рдЧрдо рдХреЛ рдзреАрдорд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ; рдФрд░ рдХрднреА-рдХрднреА рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдмреНрд▓реЙрдХ рдХреБрдЫ рд╕реАрдкреАрдпреВ рдХреИрд╢ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк 64 KB рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ - рдЗрд╕рд▓рд┐рдП рд╕рдВрдкреАрдбрд╝рд┐рдд рдФрд░ рдЕрд╕рдореНрдкреАрдбрд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдмрдлрд╝рд░реНрд╕ L2 рдХреИрд╢ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдВрдЧреЗ рдФрд░ рдЖрдзрд╛ рд░рд╣реЗрдЧрд╛ред
рдпрджрд┐ рд╣рдореЗрдВ рдПрдХ рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдмрд╕ рд╕рдВрдХреБрдЪрд┐рдд рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдХреБрдЪрд┐рдд рдмреНрд▓реЙрдХ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ - рдЖрдХрд╛рд░, рдЪреЗрдХ-рдпреЛрдЧ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдореИрдЪ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдСрдлрд╕реЗрдЯ рд╕реАрдорд┐рдд рд╣реИ, LZ4 рдореЗрдВ - 64 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯред рдЗрд╕ рдорд╛рди рдХреЛ рд╕реНрд▓рд╛рдЗрдбрд┐рдВрдЧ рд╡рд┐рдВрдбреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдХрд░реНрд╕рд░ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИ, рдорд┐рд▓рд╛рди рдХрд░реНрд╕рд░ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ 64 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдХреА рдЦрд┐рдбрд╝рдХреА рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдЪрд▓рддрд╛ рд╣реИред
рдЕрдм рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╕реЗ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП - рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдорд┐рд▓рд╛рди рдЕрдиреБрдХреНрд░рдо рдХреИрд╕реЗ рдвреВрдВрдвреЗрдВред рдмреЗрд╢рдХ, рдЖрдк рдкреНрд░рддреНрдпрдп рдЯреНрд░рд╛рдЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдорд╣рд╛рди рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ)ред рдРрд╕реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╕рдмрд╕реЗ рд▓рдВрдмреЗ рдорд┐рд▓рд╛рди рдЕрдиреБрдХреНрд░рдо рд╕рдВрдкреАрдбрд╝рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмреАрдЪ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред рдЗрд╕реЗ рдЗрд╖реНрдЯрддрдо рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдкреАрдбрд╝рд┐рдд рдмреНрд▓реЙрдХ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП
рд▓рдЧрднрдЧ рдмреЗрд╣рддрд░ рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ - рдЬрдм рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдореЗрдВ рдХреБрдЫ рдЕрдЪреНрдЫреЗ рдкрд░реНрдпрд╛рдкреНрдд рдореЗрд▓ рдорд┐рд▓рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╕рдмрд╕реЗ рд▓рдВрдмрд╛ рд╣реЛред рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА рддрд░реАрдХрд╛ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд░реНрд╕рд░ рдХреЗ рдмрд╛рдж рдХреБрдЫ рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 4 рдмрд╛рдЗрдЯреНрд╕ред рдЙрдиреНрд╣реЗрдВ рд╣реИрд╢ рдХрд░реЗрдВ рдФрд░ рд╣реИрд╢ рдЯреЗрдмрд▓ рдореЗрдВ рдмреНрд▓реЙрдХ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдСрдлрд╕реЗрдЯ рдХрд░реЗрдВ - рдЬрд╣рд╛рдВ рдпреЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдорд┐рд▓реЗ рдереЗред рд╡реИрд▓реНрдпреВ 4 рдХреЛ рдорд╛рдЗрди-рдореИрдЪ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣реИрд╢ рдЯреЗрдмрд▓ рдХреА рдорджрдж рд╕реЗ рд╣рдо рдХрдо рд╕реЗ рдХрдо 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдореИрдЪ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рд╣рдордиреЗ рд╣реИрд╢ рдЯреЗрдмрд▓ рдкрд░ рджреЗрдЦрд╛, рдФрд░ рд╡рд╣рд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд╣реИ, рдФрд░ рдпрджрд┐ рдСрдлрд╕реЗрдЯ рд╕реНрд▓рд╛рдЗрдбрд┐рдВрдЧ рд╡рд┐рдВрдбреЛ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЗрди рдЪрд╛рд░ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмрд╛рдж рдХрд┐рддрдиреЗ рдФрд░ рдмрд╛рдЗрдЯреНрд╕ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдмрд╣реБрдд рдХреБрдЫ рд╣реИ рдЬреЛ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЛрдИ рдЯрдХреНрдХрд░ рд╣реБрдИ рд╣реЛ рдФрд░ рдХреБрдЫ рднреА рдореИрдЪ рди рд╣реЛред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ - рдЖрдк рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдореВрд▓реНрдп рдХреЛ рдПрдХ рдирдП рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЯрдХрд░рд╛рд╡ рдХрдо рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдХрдо рдореИрдЪ рд╣реЛрддреЗ рд╣реИрдВред рд╡реИрд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреА рд╣реИрд╢ рдЯреЗрдмрд▓ (рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдФрд░ рдмрд┐рдирд╛ рдЯрдХрд░рд╛рд╡ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ) рдХреЛ рдХреИрд╢ рдЯреЗрдмрд▓, рдХреИрд╢ рдЯреЗрдмрд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рднреА рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ - рдЯрдХрд░рд╛рд╡ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреИрд╢ рдЯреЗрдмрд▓ рдкреБрд░рд╛рдиреЗ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реИред
рдЪреМрдХрд╕ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпред рдбреЗрдЯрд╛ рдХреЛ рдЫреЛрдЯреА рдПрдВрдбрд┐рдпрди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ UInt32 рдЬреИрд╕реА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рд░рдгреА рд╣реЛрдиреЗ рджреЗрдВ, рдЬреЛ рдХрд┐ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ: 0, 1, 2 ... рдмрддрд╛рдПрдВ рдХрд┐ LZ4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдбреЗрдЯрд╛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдЕрд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реИ)ред
рдЪреАрдЬреЛрдВ рдХреЛ рдХреИрд╕реЗ рдЧрддрд┐ рджреЗрдВ
рдЗрд╕рд▓рд┐рдП, рдореИрдВ LZ4 рдХреА рдЕрдирд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдЧрддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЙрддрд░рд╛рдИ рдЪрдХреНрд░ рдХреНрдпрд╛ рд╣реИ? рдпрд╣рд╛рдБ рдЫрджреНрдордХреЛрдб рдореЗрдВ рд▓реВрдк рд╣реИ:
рдЬрдмрдХрд┐ (...)
{
read (input_pos, literal_length, match_length);
copy (output_pos, input_pos, literal_length);
output_pos + = literal_length;
read (input_pos, match_offset);
рдХреЙрдкреА (output_pos, output_pos - match_offset,
match_length);
output_pos + = match_length;
}
LZ4 рдкреНрд░рд╛рд░реВрдк рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдПрдХ рд╕рдВрдкреАрдбрд╝рд┐рдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рд╢рд╛рдмреНрджрд┐рдХ рдФрд░ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реЛред рдФрд░ рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╢рд╛рдмреНрджрд┐рдХ рд╣рдореЗрд╢рд╛ рдкрд╣рд▓реЗ рд╕реЗ рдЖрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рд╕реЗ рдореИрдЪ рдХрд╣реАрдВ рд╕реЗ рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рдЙрдирдХреА рд▓рдВрдмрд╛рдИ рдПрдХ рд╕рд╛рде рдПрдиреНрдХреЛрдбреЗрдб рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдПрдХ рдмрд╛рдЗрдЯ рдХреЛ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рд╕реЗ рджреЛ рдирд┐рдмрд▓ рд▓реЗ рд▓рд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ 0 рд╕реЗ 15 рддрдХ рдХреА рд╕рдВрдЦреНрдпрд╛рдПрдБ рдПрдиреНрдХреЛрдбреЗрдб рд╣реЛрддреА рд╣реИрдВред рдпрджрд┐ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдЦреНрдпрд╛ 15 рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдХреНрд░рдорд╢рдГ рд╢рд╛рдмреНрджрд┐рдХ рдФрд░ рдорд┐рд▓рд╛рди рдХреА рд▓рдВрдмрд╛рдИ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рдпрд╣ 15 рд╣реИ, рддреЛ рд▓рдВрдмрд╛рдИ рд▓рдВрдмреА рд╣реИ рдФрд░ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб рд╣реИред рдлрд┐рд░ рдЕрдЧрд▓рд╛ рдмрд╛рдЗрдЯ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдорд╛рди рд▓рдВрдмрд╛рдИ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдпрд╣ 255 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рд╣рдо рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ - рд╣рдо рдЕрдЧрд▓реЗ рдмрд╛рдЗрдЯ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ LZ4 рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд 255 рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред рдФрд░ рджреВрд╕рд░рд╛ (рдмреЗрдХрд╛рд░) рдЕрд╡рд▓реЛрдХрди: рдпрджрд┐ рдЖрдкрдХрд╛ рдбреЗрдЯрд╛ рдмрд╣реБрдд рдмреЗрдорд╛рдиреА рд╣реИ, рддреЛ LZ4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рджреЛрдЧреБрдирд╛ рдмрдврд╝ рдЬрд╛рдПрдЧрд╛ред
рдЬрдм рд╣рдо рд╢рд╛рдмреНрджрд┐рдХ рдХреА рд▓рдВрдмрд╛рдИ (рдФрд░ рдлрд┐рд░ рдореИрдЪ рдХреА рд▓рдВрдмрд╛рдИ рдФрд░ рдСрдлрд╝рд╕реЗрдЯ рдСрдлрд╝ рдж рдореИрдЪ) рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рджреЛ рдЯреБрдХрдбрд╝реЛрдВ рдХреА рд╕реНрдореГрддрд┐ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рд╕реНрдореГрддрд┐ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреА рдирдХрд▓ рдХреИрд╕реЗ рдХрд░реЗрдВ
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк
memcpy
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдмрд╕ рдореЗрдореЛрд░реА рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИ рдФрд░ рдЕрднреА рднреА рдЧрд▓рдд рд╣реИред
рдореЗрдореЙрдкреА рдлрдВрдХреНрд╢рди рдХреЛ рдХреНрдпреЛрдВ рдЕрдкрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣:
- рдЖрдорддреМрд░ рдкрд░ libc рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИ (рдФрд░ libc рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдорддреМрд░ рдкрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдВрдХ рд╣реЛрддреА рд╣реИ, рдФрд░ рдореЗрдорд╕реАрдкреА рдХреЙрд▓ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ, PLT рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдПрдЧреА),
- рд╕рдВрдХрд▓рди рд╕рдордп рдореЗрдВ рдЕрдирдЬрд╛рди рдЖрдХрд╛рд░ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЗрдирд▓рд╛рдЗрди рдирд╣реАрдВ,
- рдПрдХ рд╕реНрдореГрддрд┐ рдЯреБрдХрдбрд╝реЗ рдХреЗ "рдкреВрдВрдЫ" рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдорд╢реАрди рд╢рдмреНрдж рдпрд╛ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдПрдХрд╛рдзрд┐рдХ рдирд╣реАрдВ рд╣реИрдВред
рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдордиреЗ рдореЗрдорд╕реАрдкреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ 5 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рджреЛ рдЪрд╛рд▓ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдмрд╛рд░ рдореЗрдВ 8 рдмрд╛рдЗрдЯреНрд╕ рдХреЙрдкреА рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
Hello world Hello wo ...
^^^^^ ^^^ - src
^^^^^ ^^^ - dst
рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдо рддреАрди рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдЗрдЯреНрд╕ рдХреА рдирдХрд▓ рдХрд░реЗрдВрдЧреЗ - рдЕрд░реНрдерд╛рддреН, рд╣рдо рд╡рд┐рджреЗрд╢ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдмрдлрд╝рд░ рд▓рд┐рдЦреЗрдВрдЧреЗред
memcpy
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджреЗрдВрдЧреЗ, рд╕реНрдореГрддрд┐ рд╕реЗ рдПрдХ "рдорд╛рд░реНрдЧ" рд╣реЛрдЧрд╛ред рдФрд░ рдЕрдЧрд░ рд╣рдордиреЗ рдПрдХ рдмрд┐рдирд╛ рдкрддреЗ рдХреЗ рдкрддреЗ рдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рддреЛ рдпреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдЗрдЯреНрд╕ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдкреЗрдЬ рдкрд░ рдпрд╛ рдмрд┐рдирд╛ рдПрдХреНрд╕реЗрд╕ рдХреЗ рдкреЗрдЬ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдореЗрдВ рд╕реЗрдЧрдлреЙрд▓реНрдЯ (рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ) рдорд┐рд▓рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЗрдирдкреБрдЯ рдмрдлрд╝рд░ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдЗрдЯреНрд╕ рддрдм рддрдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдЗрдЯреНрд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрд╕рдореЗрдВ рди рд╣реЛрдВред рдЙрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд╝рд░ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ - рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╡реИрд╕реЗ рднреА рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджреЗрдВрдЧреЗред
рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореВрд▓ LZ4 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╣реИ:
рдЗрдирд▓рд╛рдЗрди рд╢реВрдиреНрдп copy8 (UInt8 * dst, рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ UInt8 * src)
{
рдпрд╛рджрдЧрд╛рд░ (dst, src, 8); /// рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореЗрдорд╕реАрдкреА рдХреЛ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
}
рдЗрдирд▓рд╛рдЗрди рд╢реВрдиреНрдп рд╡рд╛рдЗрд▓реНрдбрдХреЙрдкреА 8 (UInt8 * dst, const UInt8 * src, UInt8 * dn_8)
{
рдХрд░рдирд╛
{
copy8 (dst, src);
dst + = 8;
src + = 8;
} рдЬрдмрдХрд┐ (dst <dst_end);
}
рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдмрдлрд░ рдХреА рд╕реАрдорд╛ рд╕реЗ рдХрд╛рдлреА рджреВрд░ рд╣реИрдВред рдпрд╣ рдореБрдХреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдмрдлрд░ рд╕реАрдорд╛рдПрдВ рдкрд╛рд░ рд╣реЛ рдЧрдИ рд╣реИрдВред рдФрд░ рдЕрдВрддрд┐рдо рдХреБрдЫ рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг - рдбреЗрдЯрд╛ рдХреА "рдкреВрдВрдЫ" - рдореБрдЦреНрдп рд▓реВрдк рдХреЗ рдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрднреА рднреА рдХреБрдЫ рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдВ рд╣реИрдВред рдЪрдХреНрд░ рдореЗрдВ рджреЛ рдкреНрд░рддрд┐рдпрд╛рдВ рд╣реИрдВ - рд╢рд╛рдмреНрджрд┐рдХ рдФрд░ рдорд┐рд▓рд╛рдиред рд▓реЗрдХрд┐рди LZ4_decompress_fast рдлрд╝рдВрдХреНрд╢рди (LZ4_decompress_safe рдХреЗ рдмрдЬрд╛рдп) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЪреЗрдХ рдПрдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЬрдм рд╣рдореЗрдВ рд╢рд╛рдмреНрджрд┐рдХ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореИрдЪ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддреЗ рд╕рдордп, рд╕рддреНрдпрд╛рдкрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди
LZ4 рдкреНрд░рд╛рд░реВрдк рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╣реА рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ
рдЯрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ:
рдЕрдВрддрд┐рдо 5 рдмрд╛рдЗрдЯреНрд╕ рд╣рдореЗрд╢рд╛ рд╢рд╛рдмреНрджрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ
рдЖрдЦрд┐рд░реА рдореИрдЪ рдмреНрд▓реЙрдХ рдЦрддреНрдо рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрдо рд╕реЗ рдХрдо 12 рдмрд╛рдЗрдЯреНрд╕ рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдирддреАрдЬрддрди, 13 рдмрд╛рдЗрдЯ рд╕реЗ рдХрдо рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЪрдпрдирд┐рдд рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдПрдХ рдореЗрдореЛрд░реА рдбреНрд░рд╛рдЗрд╡ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк LZ4_decompress_fast рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЦрд░рд╛рдм рдбреЗрдЯрд╛ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЪреЗрдХ-рдпреЛрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЕрдЧрд░ рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╣рдорд▓рд╛рд╡рд░ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ LZ4_decompress_safe рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк: рдЪреЗрдХ рд░рд╛рд╢рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рд▓реЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдорд╛рд░ рджреЗрдЧрд╛; рдпрд╛ рддреЛ рдмрдлрд╝рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВ; рдпрд╛ рддреЛ mmap рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдмрдлрд╝рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВ рдФрд░ рдПрдХ рдЧрд╛рд░реНрдб рдкреЗрдЬ рдмрдирд╛рдПрдВред
рдЬрдм рдореБрдЭреЗ рдПрдХ рдХреЛрдб рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬреЛ 8 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рддреБрд░рдВрдд рдкреВрдЫрддрд╛ рд╣реВрдВ - рдмрд┐рд▓реНрдХреБрд▓ 8 рдмрд╛рдЗрдЯреНрд╕ рдХреНрдпреЛрдВ? рдЖрдк SSE рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 16 рдмрд╛рдЗрдЯреНрд╕ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдЗрдирд▓рд╛рдЗрди рд╢реВрдиреНрдп copy16 (UInt8 * dst, рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ UInt8 * src)
{
#if __SSE2__
_mm_storeu_si128 (reinterpret_cast <__ m128i *> (dst),
_mm_loadu_si128 (reinterpret_cast <const __m128i *> (src)));
#else
рдпрд╛рджрдЧрд╛рд░ (dst, src, 16);
#endif
}
рдЗрдирд▓рд╛рдЗрди рд╢реВрдиреНрдп рд╡рд╛рдЗрд▓реНрдбрдХреЙрдкреА 16 (UInt8 * dst, рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ UInt8 * src, UInt8 * dn_8)
{
рдХрд░рдирд╛
{
copy16 (dst, src);
dst + = 16;
src + = 16;
} рдЬрдмрдХрд┐ (dst <dst_end);
}
AVX-512 рдХреЗ рд▓рд┐рдП 32 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдХреЙрдкреА рдХрд░рдирд╛ рдФрд░ AVX-512 рдХреЗ рд▓рд┐рдП 64 рдмрд╛рдЗрдЯреНрд╕ рдЗрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдХрдИ рдмрд╛рд░ рдЪрдХреНрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдиреЗ рдХрднреА рджреЗрдЦрд╛ рд╣реИ рдХрд┐
memcpy
рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛
memcpy
рд╣реИ, рддреЛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред (рд╡реИрд╕реЗ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдХрд▓рдХ рди рддреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдЧрд╛ рдФрд░ рди рд╣реА рд▓реВрдк рдХреЛ рд╡реЗрдХреНрдЯрд░ рдХрд░реЗрдЧрд╛: рдЗрд╕рдХреЗ рд▓рд┐рдП рдмреЛрдЭрд┐рд▓ рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред)
рдореВрд▓ LZ4 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ рдпрд╛ рдмрджрддрд░ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЕрдЪрд╛рдирдХ рд╡реЗ рд╕рднреА рдЫреЛрдЯреЗ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдмреЗрдХрд╛рд░ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ? рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдпрд╣ LZ4 рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЖрдВрддрд░рд┐рдХ рд▓реВрдк рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдмреНрд░рдВрдЪ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдлрд┐рд░ рднреА, рд╣рдо рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЕрднреА рдХреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВрдЧреЗред
рдЯреНрд░рд┐рдХреА рдХреЙрдкреА
рд╕рд╡рд╛рд▓ рдкрд░ рд╡рд╛рдкрд╕ - рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбреЗрдЯрд╛ рдХреА рдирдХрд▓ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рд╣реИ? рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдореЗрдВ рдПрдХ рдореИрдЪ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЕрд░реНрдерд╛рдд, рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд░ рд╕реЗ рдореЗрдореЛрд░реА рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдХреЙрдкреА рдХрд░реЗрдВ рдЬреЛ рдХрд░реНрд╕рд░ рдХреЗ рдкреАрдЫреЗ рдХреБрдЫ рдСрдлрд╕реЗрдЯ рдкрд░ рдЗрд╕ рдХрд░реНрд╕рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИред
рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ - рдЖрдкрдХреЛ рдСрдлрд╕реЗрдЯ 12 рдкрд░ 5 рдмрд╛рдЗрдЯреНрд╕ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
Hello world ...........
^^^^^ - src
^^^^^ - dst
Hello world Hello wo ...
^^^^^ - src
^^^^^ - dst
рд▓реЗрдХрд┐рди рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓рд╛ рд╣реИ - рдЬрдм рд╣рдореЗрдВ рд╕реНрдореГрддрд┐ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреА рд▓рдВрдмрд╛рдИ рдСрдлрд╕реЗрдЯ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИред рдпрд╣реА рд╣реИ, рдпрд╣ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрднреА рддрдХ рдЖрдЙрдЯрдкреБрдЯ рдмрдлрд░ рдХреЛ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рдСрдлрд╕реЗрдЯ 3 рдкрд░ 10 рдмрд╛рдЗрдЯреНрд╕ рдХреЙрдкреА рдХрд░реЗрдВ:
abc .............
^^^^^^^^^^ - src
^^^^^^^^^^ - dst
abc abcabcabca ...
^^^^^^^^^^ - src
^^^^^^^^^^ - dst
рд╕рдВрдкреАрдбрд╝рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рдбреЗрдЯрд╛ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдРрд╕рд╛ рдореИрдЪ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред
memcpy
рдлрд╝рдВрдХреНрд╢рди рдЗрд╕реЗ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ: рдпрд╣ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдореЗрдореЛрд░реА рдХреЗ рдЯреБрдХрдбрд╝реЗ рдЦрдВрдбрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рд╡реИрд╕реЗ,
memmove
рдлрд╝рдВрдХреНрд╢рди рднреА рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЯреБрдХрдбрд╝рд╛ рдЕрднреА рддрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рд╣рдо рдмрд╛рдЗрдЯ рджреНрд╡рд╛рд░рд╛ рдХреЙрдкреА рдХрд░ рд░рд╣реЗ рдереЗред
op [реж] = рдореИрдЪ [реж];
op [рез] = рдорд┐рд▓рд╛рди [рез];
op [реи] = рдорд┐рд▓рд╛рди [реи];
op [рей] = рдорд┐рд▓рд╛рди [рей];
...
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
a bc a ............
^ - src
^ - dst
a b ca b ...........
^ - src
^ - dst
ab c ab c ..........
^ - src
^ - dst
abc a bc a .........
^ - src
^ - dst
abca b ca b ........
^ - src
^ - dst
рдпрд╣реА рд╣реИ, рд╣рдореЗрдВ рдПрдХ рджреЛрд╣рд░рд╛рд╡ рдЕрдиреБрдХреНрд░рдо рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдореВрд▓ LZ4 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛ рдХреЛрдб рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛:
const рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд dec32table [] = {0, 1, 2, 1, 4, 4, 4, 4};
const int dec64table [] = {0, 0, 0, -1, 0, 1, 2, 3};
const int dec64 = dec64table [рдСрдлрд╕реЗрдЯ];
op [реж] = рдореИрдЪ [реж];
op [рез] = рдорд┐рд▓рд╛рди [рез];
op [реи] = рдорд┐рд▓рд╛рди [реи];
op [рей] = рдорд┐рд▓рд╛рди [рей];
рдореИрдЪ + = dec32table [рдСрдлрд╕реЗрдЯ];
memcpy (рдСрдк + 4, рдореИрдЪ, 4);
рдореИрдЪ - = рдбреЗ 64;
рд╣рдо рдкрд╣рд▓реЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдмрд╛рдп-рдмрд╛рдп рдХрд░рддреЗ рд╣реИрдВ, рдХреБрдЫ рдореИрдЬрд┐рдХ рдирдВрдмрд░ рд╕реЗ рд╢рд┐рдлреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдЧрд▓реЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ, рдкреЙрдЗрдВрдЯрд░ рдХреЛ рджреВрд╕рд░реЗ рдореИрдЬрд┐рдХ рдирдВрдмрд░ рд╕реЗ рдореИрдЪ рдХрд░рддреЗ рд╣реИрдВред рдХреЛрдб рд▓реЗрдЦрдХ (
рдЬрд╛рди рдХреЛрд▓реЗрдЯ ), рдХреБрдЫ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдХреНрдпрд╛ рд╣реИ рдкрд░ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝рдирд╛ рднреВрд▓ рдЧрдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪрд░ рдирд╛рдо рднреНрд░рдорд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рджреЛрдиреЛрдВ рдХреЛ рдбрд┐рдХ ... рдЯреЗрдмрд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рджреВрд╕рд░реЗ рдХреЛ рдШрдЯрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдФрд░ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдЕрдВрддрд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╢реНрд░рджреНрдзрд╛рдВрдЬрд▓рд┐ рджреЗрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ: рдЕрднреА рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд▓реЗрдЦрдХ рдиреЗ рдХреЛрдб рдореЗрдВ рдЗрд╕ рд╕реНрдерд╛рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ред
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдмрд╛рдЗрдЯ рдХреЙрдкреА рдХрд░реЗрдВ:
abc abca .........
^^^^ - src
^^^^ - dst
рдЕрдм рдЖрдк рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
abcabca bcab .....
^^^^ - src
^^^^ - dst
рдЖрдк рдПрдХ рд╕рд╛рде 8 рдмрд╛рдЗрдЯреНрд╕ рдХреЙрдкреА рдХрд░рдХреЗ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
abcabcabcab cabcabca .....
^^^^^^^^ - src
^^^^^^^^ - dst
, тАФ . :
inline void copyOverlap8(UInt8 * op, const UInt8 *& match, const size_t offset)
{
/// 4 % n.
/// Or if 4 % n is zero, we use n.
/// It gives equivalent result, but is better CPU friendly for unknown reason.
static constexpr int shift1[] = { 0, 1, 2, 1, 4, 4, 4, 4 };
/// 8 % n - 4 % n
static constexpr int shift2[] = { 0, 0, 0, 1, 0, -1, -2, -3 };
op[0] = match[0];
op[1] = match[1];
op[2] = match[2];
op[3] = match[3];
match += shift1[offset];
memcpy(op + 4, match, 4);
match += shift2[offset];
}
, , . , , тАФ 16 .
┬л ┬╗ , (
offset < 16
,
offset < 8
). () 16- :
inline void copyOverlap16(UInt8 * op, const UInt8 *& match, const size_t offset)
{
/// 4 % n.
static constexpr int shift1[]
= { 0, 1, 2, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 };
/// 8 % n - 4 % n
static constexpr int shift2[]
= { 0, 0, 0, 1, 0, -1, -2, -3, -4, 4, 4, 4, 4, 4, 4, 4 };
/// 16 % n - 8 % n
static constexpr int shift3[]
= { 0, 0, 0, -1, 0, -2, 2, 1, 8, -1, -2, -3, -4, -5, -6, -7 };
op[0] = match[0];
op[1] = match[1];
op[2] = match[2];
op[3] = match[3];
match += shift1[offset];
memcpy(op + 4, match, 4);
match += shift2[offset];
memcpy(op + 8, match, 8);
match += shift3[offset];
}
? , SIMD-, 16 , ( 1 15). , , .
тАФ
pshufb
( packed shuffle bytes) SSSE3 ( S). 16- . . тАФ ┬л┬╗: 0 15 тАФ , . , 127 тАФ .
рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
xmm0: abc.............
xmm1: 0120120120120120
pshufb %xmm1, %xmm0
xmm0: abcabcabcabcabca
тАФ ! :
inline void copyOverlap16Shuffle(UInt8 * op, const UInt8 *& match, const size_t offset)
{
#ifdef __SSSE3__
static constexpr UInt8 __attribute__((__aligned__(16))) masks[] =
{
0, 1, 2, 1, 4, 1, 4, 2, 8, 7, 6, 5, 4, 3, 2, 1, /* offset = 0, not used as mask, but for shift amount instead */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* offset = 1 */
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0,
0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3,
0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0,
0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1,
0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7,
0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 1, 2, 3, 4,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 1, 2,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 1,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0,
};
_mm_storeu_si128(reinterpret_cast<__m128i *>(op),
_mm_shuffle_epi8(
_mm_loadu_si128(reinterpret_cast<const __m128i *>(match)),
_mm_load_si128(reinterpret_cast<const __m128i *>(masks) + offset)));
match += masks[offset];
#else
copyOverlap16(op, match, offset);
#endif
}
_mm_shuffle_epi8
тАФ
intrinsic ,
pshufb
.
, ? SSSE3 тАФ , 2006 . AVX2 , 32 , 16- . packed shuffle bytes, vector permute bytes тАФ , . AVX-512 VBMI , 64 , . ARM NEON тАФ vtbl (vector table lookup), 8 .
,
pshufb
64- MMX-, 8 . . , , 16 ( ).
Highload++ Siberia , 8 ( ) тАФ !
if
, , 16 . ?
, . , , , . , .
, . , , , 65 536 . 65 536 . , , 65 551 . , , 96 128 тАФ . , ┬л┬╗ mmap ( madvice). - page faults. , .
?
, , :
- 16 8.
- shuffle-
offset < 16
. - if.
.
рдЙрджрд╛рд╣рд░рдг 1:
Xeon E2650v2, ., AppVersion.
reference: 1.67 GB/sec.
16 bytes, shuffle: 2.94 GB/sec ( 76% ).
рдЙрджрд╛рд╣рд░рдг 2:
Xeon E2650v2, ., ShowsSumPosition.
reference: 2.30 GB/sec.
16 bytes, shuffle: 1.91 GB/sec ( 20% ).
, . , . - , . , . тАФ 16 . : , , .
, C++ : 8- 16- ; shuffle-.
template <size_t copy_amount, bool use_shuffle>
void NO_INLINE decompressImpl(
const char * const source,
char * const dest,
size_t dest_size)
, shuffle . , :
sudo echo 'performance' | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
kill -STOP $(pidof firefox) $(pidof chromium)
┬л┬╗ (c Xeon E5645), , . , , . , shuffle-, , 16- .
:
sudo kill -STOP $(pidof python) $(pidof perl) $(pgrep -u skynet) $(pidof cqudp-client)
. thermal throttling power capping.
, , . , , . . , , . : ClickHouse , , . , ( тАФ ?). .
, , .
┬л ┬╗ . , , , .
, . . - . тАФ ClickHouse 64 . (
.)
, ┬л ┬╗, , . , , , - . . , , . .
, , . ┬л┬╗ , . , . Thompson Sampling.
, , . тАФ : , . . , . , C++. тАФ , - , ; .
? , . . -, , . -, , , ┬л┬╗ .
, , Thompson Sampling тАФ ( , ). , , - , , . , .
, ┬л┬╗ . , , ┬л┬╗, . тАФ
. , , .
, , , , ┬л┬╗:
/// For better convergence, we don't use proper estimate of stddev.
/// We want to eventually separate between two algorithms even in case
/// when there is no statistical significant difference between them.
double sigma() const
{
return mean() / sqrt(adjustedCount());
}
double sample(pcg64 & rng) const
{
...
return std::normal_distribution<>(mean(), sigma())(rng);
}
, тАФ memory latencies.
, , тАФ LZ4 .
, :
тАФ reference (baseline): LZ4 ;
тАФ variant 0: 8 , shuffle;
тАФ variant 1: 8 , shuffle;
тАФ variant 2: 16 , shuffle;
тАФ variant 3: 16 , shuffle;
тАФ ┬л┬╗ , .
CPU
CPU, , . , CPU ?
ClickHouse , 256 100 ( 256 ). , CPU , . CPU:
тАФ Intel┬о Xeon┬о CPU E5-2650 v2 @ 2.60GHz
тАФ Intel┬о Xeon┬о CPU E5-2660 v4 @ 2.00GHz
тАФ Intel┬о Xeon┬о CPU E5-2660 0 @ 2.20GHz
тАФ Intel┬о Xeon┬о CPU E5645 @ 2.40GHz
тАФ Intel Xeon E312xx (Sandy Bridge)
тАФ AMD Opteron(TM) Processor 6274
тАФ AMD Opteron(tm) Processor 6380
тАФ Intel┬о Xeon┬о CPU E5-2683 v4 @ 2.10GHz
тАФ Intel┬о Xeon┬о CPU E5530 @ 2.40GHz
тАФ Intel┬о Xeon┬о CPU E5440 @ 2.83GHz
тАФ Intel┬о Xeon┬о CPU E5-2667 v2 @ 3.30GHz
тАФ , R&D:
тАФ AMD EPYC 7351 16-Core Processor тАФ AMD.
тАФ Cavium ThunderX2 тАФ x86, AArch64. SIMD- . 224 56 .
13 , 256 6 (reference, 0, 1, 2, 3, adaptive), 10 , . 199 680 , .
, CPU . : LZ4 ( тАФ ). , Cavium . ClickHouse, ┬л┬╗ Xeon E5-2650 v2 , , ClickHouse x86.
тФМтФАcpuтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФмтФАтФАrefтФАтФмтФАadaptтФАтФмтФАтФАmaxтФАтФмтФАbestтФАтФмтФАadapt_boostтФАтФмтФАmax_boostтФАтФмтФАadapt_over_maxтФАтФР
тФВ E5-2667 v2 @ 3.30GHz тФВ 2.81 тФВ 3.19 тФВ 3.15 тФВ 3 тФВ 1.14 тФВ 1.12 тФВ 1.01 тФВ
тФВ E5-2650 v2 @ 2.60GHz тФВ 2.5 тФВ 2.84 тФВ 2.81 тФВ 3 тФВ 1.14 тФВ 1.12 тФВ 1.01 тФВ
тФВ E5-2683 v4 @ 2.10GHz тФВ 2.26 тФВ 2.63 тФВ 2.59 тФВ 3 тФВ 1.16 тФВ 1.15 тФВ 1.02 тФВ
тФВ E5-2660 v4 @ 2.00GHz тФВ 2.15 тФВ 2.49 тФВ 2.46 тФВ 3 тФВ 1.16 тФВ 1.14 тФВ 1.01 тФВ
тФВ AMD EPYC 7351 тФВ 2.03 тФВ 2.44 тФВ 2.35 тФВ 3 тФВ 1.20 тФВ 1.16 тФВ 1.04 тФВ
тФВ E5-2660 0 @ 2.20GHz тФВ 2.13 тФВ 2.39 тФВ 2.37 тФВ 3 тФВ 1.12 тФВ 1.11 тФВ 1.01 тФВ
тФВ E312xx (Sandy Bridge) тФВ 1.97 тФВ 2.2 тФВ 2.18 тФВ 3 тФВ 1.12 тФВ 1.11 тФВ 1.01 тФВ
тФВ E5530 @ 2.40GHz тФВ 1.65 тФВ 1.93 тФВ 1.94 тФВ 3 тФВ 1.17 тФВ 1.18 тФВ 0.99 тФВ
тФВ E5645 @ 2.40GHz тФВ 1.65 тФВ 1.92 тФВ 1.94 тФВ 3 тФВ 1.16 тФВ 1.18 тФВ 0.99 тФВ
тФВ AMD Opteron 6380 тФВ 1.47 тФВ 1.58 тФВ 1.56 тФВ 1 тФВ 1.07 тФВ 1.06 тФВ 1.01 тФВ
тФВ AMD Opteron 6274 тФВ 1.15 тФВ 1.35 тФВ 1.35 тФВ 1 тФВ 1.17 тФВ 1.17 тФВ 1 тФВ
тФВ E5440 @ 2.83GHz тФВ 1.35 тФВ 1.33 тФВ 1.42 тФВ 1 тФВ 0.99 тФВ 1.05 тФВ 0.94 тФВ
тФВ Cavium ThunderX2 тФВ 0.84 тФВ 0.87 тФВ 0.87 тФВ 0 тФВ 1.04 тФВ 1.04 тФВ 1 тФВ
тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФ┤тФАтФАтФАтФАтФАтФАтФ┤тФАтФАтФАтФАтФАтФАтФАтФ┤тФАтФАтФАтФАтФАтФАтФ┤тФАтФАтФАтФАтФАтФАтФ┤тФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФ┤тФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФ┤тФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФШ
ref, adapt, max тАФ (, ). best тАФ , 0 3. adapt_boost тАФ baseline. max_boost тАФ baseline. adapt_over_max тАФ .
, x86 12тАУ20%. ARM 4%, , . , ┬л┬╗ Intel.
рдирд┐рд╖реНрдХрд░реНрд╖
. , LZ4 12тАУ20%, . . , .
, , ┬л┬╗ , ZStandard level 1 LZ4: IO .
тАФ , . , .
: . LZ4 , Lizard, Density LZSSE , . , LZ4 LZSSE ClickHouse.
LZ4 : . : , . . , inc- dec-
. , 12тАУ15% 32 , 16, . 32 тАФ ,
.
, , page cache userspace ( mmap, O_DIRECT userspace page cache тАФ ), - ( CityHash128 CRC32-C, HighwayHash, FARSH XXH3). , .
, master, .
HighLoad++ Siberia,
.