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

рддреЛ рдХреНрдпреЛрдВ LZ4 рдЕрдкрдШрдЯрди рдПрдХ рдЕрдбрд╝рдЪрди рдмрди рдЬрд╛рддрд╛ рд╣реИ? LZ4 рдПрдХ
рдЕрддреНрдпрдВрдд рдкреНрд░рдХрд╛рд╢ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рддрд░рд╣ рд▓рдЧрддрд╛
рд╣реИ : рдбреЗрдЯрд╛ рд╡рд┐рдШрдЯрди рджрд░ рдЖрдорддреМрд░ рдкрд░ 1 рд╕реЗ 3 рдЬреАрдмреА / рдПрд╕ рдкреНрд░рддрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рд╕реЗ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбрд┐рд╕реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╕реАрдкреАрдпреВ рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рднреМрддрд┐рдХ рдХреЛрд░ рдореЗрдВ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рдШрдЯрди рддрд░рд╛рдЬреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдмрд┐рдВрджреБ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдбрд┐рд╕реНрдХ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд╕рдореНрдкреАрдбрд┐рдд рдЧрддрд┐ рдХреЛ рдЕрд╕рдореНрдкреАрдбрд┐рдд рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИ, рддреЛ рдбрд┐рд╕реНрдХ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рдШрдЯрд┐рдд рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╕реАрдкреАрдпреВ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ: рдПрд▓рдЬреЗрдб 4 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреАрдХрдВрдкреНрд░реЗрд╕ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдХреА рдорд╛рддреНрд░рд╛ рд╡рд┐рдШрдЯрд┐рдд рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рд▓рдЧрднрдЧ рдЖрдиреБрдкрд╛рддрд┐рдХ рд╣реИред
рджреВрд╕рд░рд╛, рдпрджрд┐ рдбреЗрдЯрд╛ рдХреИрд╢ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдбрд┐рд╕реНрдХ рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЖрдк рдкреЗрдЬ рдХреИрд╢ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреЙрд▓рдо рдЙрдиреНрдореБрдЦ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЙрд▓рдо рдХреИрд╢ рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕реАрдкреАрдпреВ рд▓реЛрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрд▓рдЬреЗрдб 4 рдЕрдХреНрд╕рд░ рдЕрдбрд╝рдЪрди рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕рд╕реЗ рджреЛ рдФрд░ рд╕рд╡рд╛рд▓ рд╕рд╛рдордиреЗ рдЖрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдЧрд░ рдЕрдкрдШрдЯрди рд╣рдореЗрдВ рдзреАрдорд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдбреЗрдЯрд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкреНрд░реЗрд╕ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ? рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдЯрдХрд▓реЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВред рд╣рд╛рд▓ рддрдХ, ClickHouse рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдбреЗрдЯрд╛ рд╕рдВрдкреАрдбрд╝рди рд╡рд┐рдХрд▓реНрдк - LZ4 рдФрд░
Zstandard рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдЧрдИ
рдереА ред LZ4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Zstandard рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдкреАрдбрд╝рди рдордЬрдмреВрдд рдФрд░ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдВрдкреАрдбрд╝рди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ LZ4 рдХреЛ рдПрдХ рдЙрдЪрд┐рдд рдиреНрдпреВрдирддрдо рд╕рдВрдкреАрдбрд╝рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ LZ4 рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВред)
рд▓реЗрдХрд┐рди рддрдм
рдЕрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдп рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рд╕рдкреЛрд░реНрдЯ рдЪреИрдЯ рдореЗрдВ рдПрдХ рд░рд╣рд╕реНрдпрдордп рдЕрдЬрдирдмреА рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдЬрд┐рд╕рдиреЗ рдХрд╣рд╛ рдХрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдПрдХ рдмрд╣реБрдд рддреЗрдЬрд╝ рдбрд┐рд╕реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рд╣реИ (NVMe SSD рдХреЗ рд╕рд╛рде) рдФрд░
рдбрд┐рдХрдВрдкреНрд░реЗрд╕рди рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рд╣реИ рдЬреЛ рдЙрд╕рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдзреАрдорд╛ рдХрд░ рд░рд╣реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмрд┐рдирд╛ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рд╕рдВрдкреАрдбрд╝рдиред рдореИрдВрдиреЗ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рдХреБрдЫ рджрд┐рдиреЛрдВ рдмрд╛рдж, рд╣рдореЗрдВ рд╕рдВрдкреАрдбрд╝рди рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ
рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдорд┐рд▓рд╛,
none
ред рдореИрдВрдиреЗ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ рд╕реЗ рд╡рд╛рдкрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдХрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдореЗрдВ рдХрд┐рддрдирд╛ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдпрд╣ рдереА рдХрд┐ рдпрд╣ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдмреЗрдХрд╛рд░ рд╣реЛ рдЧрдИ рдереА, рдХреНрдпреЛрдВрдХрд┐ рдЕрд╕рдореНрдкреАрдбрд┐рдд рдбреЗрдЯрд╛ рдиреЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди рд▓реЗрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдерд╛ рдФрд░ рд╡реЗ рдПрдирд╡реАрдПрдордИ рдбреНрд░рд╛рдЗрд╡ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рдереЗред
рджреВрд╕рд░рд╛ рдкреНрд░рд╢реНрди рдЬреЛ рдЙрдарддрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рдХреИрд╢ рд╣реИ, рддреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдШрдЯрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВ? рдпрд╣ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдЬреЛ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд┐рдШрдЯрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛ред ClickHouse рдореЗрдВ рднреА рдЗрд╕ рддрд░рд╣
рдХрд╛ рдХреИрд╢ рд╣реЛрддрд╛ рд╣реИ: рд╡рд┐рдШрдЯрд┐рдд рдмреНрд▓реЙрдХ рдХрд╛ рдХреИрд╢ ред рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд░реИрдо рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░рдирд╛ рдПрдХ рджрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдХреЗрд╡рд▓ рдЫреЛрдЯреЗ, рдЕрдиреБрдХреНрд░рдорд┐рдХ рдкреНрд░рд╢реНрдиреЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬреЛ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдорд╛рд░рд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдкреАрдбрд╝рд┐рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рд╣рдореЗрд╢рд╛ рд╕рдВрдХреБрдЪрд┐рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбрд┐рд╕реНрдХ рдкрд░ рдбреЗрдЯрд╛ рд▓рд┐рдЦреЗрдВред рд╕рдВрдкреАрдбрд╝рди рдХреЗ рд╕рд╛рде рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░реЗрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рдеред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрдкреНрд░реЗрд╢рди рдиреНрдпрд╛рдпрд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж 10 рдЬреАрдмреА рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдПрдХ рдПрдХрд▓ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ рдХреЗ рднреАрддрд░ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рднреА рдЙрдЪрд┐рдд рд╣реИ, рдЬрдмрдХрд┐ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрд╕рдореНрдкреАрдбрд┐рдд рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдХреЗрд╡рд▓ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред
рдХреНрдпреЛрдВ LZ4?
LZ4 рдХреНрдпреЛрдВ рдЪреБрдиреЗрдВ? рдХреНрдпрд╛ рд╣рдо рдХреБрдЫ рд╣рд▓реНрдХрд╛ рднреА рдирд╣реАрдВ рдЪреБрди рд╕рдХрддреЗ рдереЗ? рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдПрд▓рдЬреЗрдб 4 рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╡рд░реНрдЧ рдХреЛ рджреЗрдЦреЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реЛрдЧрд╛, рддреЛ рдЖрдк VarInt рдПрд▓реНрдЧреЛрд░рд┐рдердо рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ CPU рдХрд╛ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рджреВрд╕рд░рд╛, LZ4 рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реЗрдВрд╕рд░ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдордмрджреНрдз рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ, рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрди рдирдВрдмрд░реЛрдВ рдХреЗ рдмреАрдЪ рдбреЗрд▓реНрдЯрд╛рд╕ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрдЪреНрдЪ рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рд╣реЛрдЧрд╛ред
рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдмрд╛рдЗрдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдпрд╛ рдХрд┐рд╕реА рднреА рдлрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде LZ4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдмреЗрд╢рдХ рдЗрд╕рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реИ (рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХ рдмрд╛рдж рдореЗрдВ), рдФрд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реНрдпрд░реНрде рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рдЪреНрдЪрд╛рдИ рдХреЗ рдХрд╛рдлреА рдХрд░реАрдм рд╣реЛрдВрдЧреЗред рд╣рдореЗрдВ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕рдХреЗ рдЖрдВрддрд░рд┐рдХ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, LZ4 рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ
RLE рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдордЧреНрд░ рдЧрддрд┐ рдФрд░ рд╕рдВрдкреАрдбрд╝рди рдХреА рддрд╛рдХрдд рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ LZ4 рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рд╕рдмрд╕реЗ рдЗрд╖реНрдЯрддрдо рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╖реНрдЯрддрдо рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдкреЗрд░реЗрдЯреЛ рд╕реАрдорд╛рдВрдд рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХреЛрдИ рдЕрдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд╣реАрдВ рд╣реИ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рддрд░рд╣ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ рдФрд░ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рднреА рдмрджрддрд░ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд┐рдзрддрд╛ рдкрд░, рд╕рд╛рде рд╣реА рд╕рд╛рде)ред рдХреБрдЫ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рддреЗрдЬрд╝ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЫреЛрдЯреЗ рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдореЗрдВ рдордЬрдмреВрдд рд╕рдВрдкреАрдбрд╝рди рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдкреАрдбрд╝рд┐рдд рдпрд╛ рд╡рд┐рдШрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреАрдорд╛ рд╣реЛрддрд╛ рд╣реИред
рд╕рдЪ рдХрд╣реВрдВ рддреЛ, LZ4 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╛рд░реЗрдЯреЛ рд╕реАрдорд╛рдВрдд рдирд╣реАрдВ рд╣реИ - рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдЬреЛ рд╕рд┐рд░реНрдл рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
LZTURBO рдХреЛ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдЙрдкрдирд╛рдо
powturbo рд╕реЗ рджреЗрдЦреЗрдВ ред рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ,
encode.ru рд╕рдореБрджрд╛рдп (рдбреЗрдЯрд╛ рд╕рдВрдкреАрдбрд╝рди рдкрд░ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдФрд░ рд╕рдВрднрд╡рддрдГ рдПрдХрдорд╛рддреНрд░ рдордВрдЪ) рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдбреЗрд╡рд▓рдкрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╛ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рд╡рд┐рддрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рд╡реЗ рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдпрд╛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреИрд╕реЗ рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдЕрднреА рддрдХ рдЗрд╕рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдлрд┐рд░ рднреА)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛
рдЫрд┐рдкрдХрд▓реА (рдкрд╣рд▓реЗ LZ5) рдФрд░
рдШрдирддреНрд╡ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдЬрдм рдЖрдк рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдкреАрдбрд╝рди рд╕реНрддрд░ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╡реЗ LZ4 рд╕реЗ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдХрд▓реНрдк
LZSSE рд╣реИ ред рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░ рд▓реЗрдВред
рдХреИрд╕реЗ lz4 рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдПрд▓рдЬреЗрдб 4 рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ LZ77 рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдПрд▓ рдФрд░ рдЬреЗрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдирд╛рдо (рд▓реЗрдореНрдкреЗрд▓ рдФрд░ рдЬрд╝рд┐рд╡) рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ 77 рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛрдиреЗ рдкрд░ рд╡рд░реНрд╖ 1977 рдХреЗ рд▓рд┐рдП рд╣реИред рдХрдИ рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ: рдХреНрд╡рд┐рдХрдПрд▓рдЬреЗрдб, рдлрд╛рд╕реНрдЯрдПрд▓рдЬреЗрдб, рдмреНрд░реАрдлреНрд▓рдЬ, рдПрд▓рдЬреЗрдбрдПрдл, рдПрд▓рдЬреЗрдбрдУ, рдФрд░ рдЬреАрдЬрд╝рд┐рдк рдФрд░ рдЬрд╝рд┐рдк рдпрджрд┐ рдХрдо рд╕рдВрдкреАрдбрд╝рди рд╕реНрддрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
LZ4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдореЗрдВ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ (рдЖрджреЗрд╢реЛрдВ рдпрд╛ рдирд┐рд░реНрджреЗрд╢реЛрдВ) рдХрд╛ рдЕрдиреБрдХреНрд░рдо рд╣реЛрддрд╛ рд╣реИ:
- рд╕рд╛рд╣рд┐рддреНрдп: "рдирд┐рдореНрди рдПрди рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдЗрд╕ рддрд░рд╣ рд▓реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рдгрд╛рдо рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ"ред
- рдореИрдЪ: "рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдСрдлрд╕реЗрдЯ рдореВрд▓реНрдп рдкрд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдШрдЯрд┐рдд рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдПрди рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрдВ"ред
рдЙрджрд╛рд╣рд░рдгред рд╕рдВрдкреАрдбрд╝рди рд╕реЗ рдкрд╣рд▓реЗ:
Hello world Hello
рд╕рдВрдкреАрдбрд╝рди рдХреЗ рдмрд╛рдж:
literals 12 "Hello world " match 5 12
рдпрджрд┐ рд╣рдо рдПрдХ рд╕рдВрдкреАрдбрд╝рд┐рдд рдмреНрд▓реЙрдХ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрди рдХрдорд╛рдВрдб рдХреЛ рдЪрд▓рд╛рддреЗ рд╕рдордп рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░реНрд╕рд░ рдХреЛ рдЗрдЯрд░реНрдиреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдореВрд▓ рдЕрд╕рдореНрдкреАрдбрд┐рдд рдбреЗрдЯрд╛ рдорд┐рд▓реЗрдЧрд╛ред
рддреЛ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рд╡рд┐рдШрдЯрд┐рдд рдХреИрд╕реЗ рд╣реИред рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рд╕рдВрдкреАрдбрд╝рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореИрдЪреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рджреЛрд╣рд░рд╛рдпрд╛ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рддрд╛ рд╣реИред
рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИрдВред рдпрд╣ рдмрд╛рдЗрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд╡рд┐рдЪреНрдЫреЗрджрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рдпрд╣ рдХреЗрд╡рд▓ рдЙрдирдХреА рд╕рдВрдкреВрд░реНрдгрддрд╛ рдХреА рдирдХрд▓ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдВрдЯреНрд░реЙрдкреА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
zstd LZ77 рдФрд░ рдПрдиреНрдЯреНрд░рд╛рдкреА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдПрдХ рд╕рдВрдпреЛрдЬрди рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рдВрдкреАрдбрд╝рд┐рдд рдмреНрд▓реЙрдХ рдХрд╛ рдЖрдХрд╛рд░ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рдШрдЯрди рдХреЗ рджреМрд░рд╛рди рдмрд╣реБрдд рд╕рд╛рд░реЗ рд░реИрдо рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдХрд╛рд░ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдВрдХреБрдЪрд┐рдд рдлрд╝рд╛рдЗрд▓ (рдЬрд┐рд╕рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рдВрдкреАрдбрд╝рд┐рдд рдмреНрд▓реЙрдХ) рд╣реЛрддреЗ рд╣реИрдВ, рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЕрднрд┐рдЧрдо рдХреЛ рдзреАрдорд╛ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдХрднреА-рдХрднреА рддреЛ рдмреНрд▓реЙрдХ рдПрдХ рд╕реАрдкреАрдпреВ рдХреИрд╢ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк 64 KB рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рдВрдХреБрдЪрд┐рдд рдФрд░ рдЕрд╕рдореНрдкреАрдбрд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдмрдлрд╝рд░ L2 рдХреИрд╢ рдореЗрдВ рдЖрдзрд╛ рдЕрднреА рднреА рдореБрдХреНрдд рд╣реЛред
рдпрджрд┐ рд╣рдореЗрдВ рдПрдХ рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕рдВрдкреАрдбрд╝рд┐рдд рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкреАрдбрд╝рд┐рдд рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ (рдЬреИрд╕реЗ рдЪреЗрдХрд╕рдо) рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдореИрдЪ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдСрдлрд╕реЗрдЯ рд╕реАрдорд┐рдд рд╣реИред LZ4 рдореЗрдВ, рд╕реАрдорд╛ 64 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рд╣реИред рдЗрд╕ рд░рд╛рд╢рд┐ рдХреЛ рд╕реНрд▓рд╛рдЗрдбрд┐рдВрдЧ рд╡рд┐рдВрдбреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрд░реНрд╕рд░ рд╕реЗ рдкрд╣рд▓реЗ 64 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдХреА рдПрдХ рдЦрд┐рдбрд╝рдХреА рдореЗрдВ рдореИрдЪ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдкрд░ рд╕реНрд▓рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╕реЗ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╛ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдорд┐рд▓рд╛рди рдЕрдиреБрдХреНрд░рдо рдХреИрд╕реЗ рдЦреЛрдЬреЗрдВред рдЖрдк рд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░рддреНрдпрдп рдЯреНрд░рд╛рдЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ)ред рдРрд╕реЗ рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдмрд╕реЗ рд▓рдВрдмрд╛ рдореИрдЪ рд╕рдВрдкреАрдбрд╝рди рдХреЗ рдмрд╛рдж рдкреВрд░реНрд╡рд╡рд░реНрддреА рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдЗрд╕реЗ рдЗрд╖реНрдЯрддрдо рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд-рдкреНрд░рд╛рд░реВрдк рд╕рдВрдкреАрдбрд╝рд┐рдд рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП
рд▓рдЧрднрдЧ рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдмреЗрд╣рддрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдЕрдЪреНрдЫрд╛-рдкрд░реНрдпрд╛рдкреНрдд рдореИрдЪ рдвреВрдВрдврдирд╛ рдЬреЛ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╕рдмрд╕реЗ рд▓рдВрдмрд╛ рд╣реЛред рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдХреБрд╢рд▓ рддрд░реАрдХрд╛ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрд░реНрд╕рд░ рдХреЛ рдбреЗрдЯрд╛ рдХреЗ рдореВрд▓ рдмреНрд▓реЙрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд░реНрд╕рд░ рдХреЗ рдмрд╛рдж рдХреБрдЫ рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддреЗ рд╣реИрдВ (рдорд╛рди рд▓реАрдЬрд┐рдП 4 рдмрд╛рдЗрдЯреНрд╕)ред рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рд╣реИрд╢ рдХрд┐рдпрд╛ рдФрд░ рдмреНрд▓реЙрдХ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ (рдЬрд╣рд╛рдВ 4 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рдХреЛ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ред рдорд╛рди 4 рдХреЛ "рдорд╛рдЗрди-рдореИрдЪ" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдХрдо рд╕реЗ рдХрдо 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдореИрдЪ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рд╣рдо рд╣реИрд╢ рдЯреЗрдмрд▓ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдорд┐рд▓рд╛рди рд░рд┐рдХреЙрд░реНрдб рд╣реИ, рдФрд░ рдСрдлрд╕реЗрдЯ рд╕реНрд▓рд╛рдЗрдбрд┐рдВрдЧ рд╡рд┐рдВрдбреЛ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЙрди 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмрд╛рдж рдХрд┐рддрдиреЗ рдмрд╛рдЗрдЯреНрд╕ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореИрдЪ рд╣реЛрдВред рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╣реИрд╢ рдЯреЗрдмрд▓ рдореЗрдВ рдЯрдХреНрдХрд░ рд╣реЛ рдФрд░ рдХреБрдЫ рднреА рдореИрдЪ рди рд╣реЛ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдИ рдмрдбрд╝реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИред рдЖрдк рдмрд╕ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдорд╛рди рдХреЛ рдПрдХ рдирдП рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЯрдХрд░рд╛рд╡ рдХрдо рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХрдо рдореИрдЪ рд╣реЛрдВрдЧреЗред рд╡реИрд╕реЗ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╣реИрд╢ рдЯреЗрдмрд▓ (рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдФрд░ рдЯрдХрд░рд╛рд╡реЛрдВ рдХрд╛ рдХреЛрдИ рд╕рдВрдХрд▓реНрдк рдирд╣реАрдВ) рдХреЛ "рдХреИрд╢ рдЯреЗрдмрд▓" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдирд╛рдо рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЯрдХрд░рд╛рд╡ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХреЗрд╡рд▓ рдкреБрд░рд╛рдиреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддреА рд╣реИред
рд╕рд╛рд╡рдзрд╛рди рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреБрдиреМрддреАред рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрдЯрд╛ рдереЛрдбрд╝рд╛ рдПрдВрдбрд┐рдпрди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ UInt32 рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рд░рдгреА рд╣реИ рдЬреЛ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдПрдХ рднрд╛рдЧ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ: 0, 1, 2 ... рдмрддрд╛рдПрдВ рдХрд┐ LZ4 (рд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдбреЗрдЯрд╛ рд╕рдВрдХреБрдЪрд┐рдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЕрд╕рдореНрдкреАрдбрд┐рдд рдбреЗрдЯрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдИ рдЫреЛрдЯрд╛ рдирд╣реАрдВ рд╣реИ)ред
рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдЧрддрд┐ рджреЗрдВ
рдЗрд╕рд▓рд┐рдП рдореИрдВ LZ4 рдЕрдкрдШрдЯрди рдХреЛ рдЧрддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╡рд┐рдШрдЯрд┐рдд рд▓реВрдк рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдпрд╣ рдЫрджреНрдордХреЛрдб рдореЗрдВ рд╣реИ:
while (...) { read(input_pos, literal_length, match_length); copy(output_pos, input_pos, literal_length); output_pos += literal_length; read(input_pos, match_offset); copy(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 рдХреЗ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ:
inline void copy8(UInt8 * dst, const UInt8 * src) { memcpy(dst, src, 8); /// Note that memcpy isn't actually called here. } inline void wildCopy8(UInt8 * dst, const UInt8 * src, UInt8 * dst_end) { do { copy8(dst, src); dst += 8; src += 8; } while (dst < dst_end); }
рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдмрдлрд░ рд╕реАрдорд╛ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИрдВред рдпрд╣ рдХреБрдЫ рднреА рдЦрд░реНрдЪ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдлрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдФрд░ рдЕрдВрддрд┐рдо рдмрд╛рдЗрдЯреНрд╕, "рдмрдЪреЗ рд╣реБрдП" рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛, рдореБрдЦреНрдп рд▓реВрдк рдХреЗ рдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрднреА рднреА рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВред рдирдХрд▓ рдкрд╛рд╢ рдореЗрдВ рджреЛ рдмрд╛рд░ рд╣реЛрддреА рд╣реИ: рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рдФрд░ рдПрдХ рдореИрдЪ рдХреЗ рд╕рд╛рдеред рд╣рд╛рд▓рд╛рдБрдХрд┐,
LZ4_decompress_fast
рдлрд╝рдВрдХреНрд╢рди (
LZ4_decompress_fast
рдмрдЬрд╛рдп) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЪреЗрдХ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рд╣рдореЗрдВ рд╢рд╛рдмреНрджрд┐рдХ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореИрдЪ рдХреА рдирдХрд▓ рдХрд░рддреЗ рд╕рдордп рдЪреЗрдХ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди
LZ4 рдкреНрд░рд╛рд░реВрдк рдХреЗ
рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ:
рдЕрдВрддрд┐рдо 5 рдмрд╛рдЗрдЯреНрд╕ рд╣рдореЗрд╢рд╛ рд╢рд╛рдмреНрджрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВред
рдЖрдЦрд┐рд░реА рдореИрдЪ рдмреНрд▓реЙрдХ рдЦрддреНрдо рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрдо рд╕реЗ рдХрдо 12 рдмрд╛рдЗрдЯреНрд╕ рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдирддреАрдЬрддрди, 13 рдмрд╛рдЗрдЯ рд╕реЗ рдХрдо рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЪрдпрдирд┐рдд рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рд╕реЗ рд╕реНрдореГрддрд┐ рднреНрд░рд╖реНрдЯрд╛рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк
LZ4_decompress_fast
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЦрд░рд╛рдм рдбреЗрдЯрд╛ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмрд╣реБрдд рдХрдо рд╕реЗ рдХрдо, рдЖрдкрдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЪреЗрдХрд╕рдо рдХреА рдЧрдгрдирд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдкрдХреЛ рд╣реИрдХрд░реНрд╕ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ
LZ4_decompress_safe
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк: рдЪреЗрдХрд╕рдо рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рд▓реЗрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ); рдмрдлрд╝рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВ; рдПрдХ рдЕрд▓рдЧ
mmap
рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдмрдлрд╝рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВ рдФрд░ рдПрдХ рдЧрд╛рд░реНрдб рдкреЗрдЬ рдмрдирд╛рдПрдВред
рдЬрдм рдореИрдВ 8 рдмрд╛рдЗрдЯреНрд╕ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рджреЗрдЦрддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рддреБрд░рдВрдд рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 8 рдмрд╛рдЗрдЯреНрд╕ рдХреНрдпреЛрдВ рд╣реИрдВред рдЖрдк SSE рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 16 рдмрд╛рдЗрдЯреНрд╕ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
inline void copy16(UInt8 * dst, const UInt8 * src) { #if __SSE2__ _mm_storeu_si128(reinterpret_cast<__m128i *>(dst), _mm_loadu_si128(reinterpret_cast<const __m128i *>(src))); #else memcpy(dst, src, 16); #endif } inline void wildCopy16(UInt8 * dst, const UInt8 * src, UInt8 * dst_end) { do { copy16(dst, src); dst += 16; src += 16; } while (dst < dst_end); }
AVX-512 рдХреЗ рд▓рд┐рдП AVX рдФрд░ 64 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП 32 рдмрд╛рдЗрдЯреНрд╕ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдХрдИ рдмрд╛рд░ рд▓реВрдк рдХреЛ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдиреЗ рдХрднреА рджреЗрдЦрд╛ рд╣реИ рдХрд┐
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[0] = match[0]; op[1] = match[1]; op[2] = match[2]; op[3] = match[3]; ...
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
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 unsigned dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; const int dec64table[] = {0, 0, 0, -1, 0, 1, 2, 3}; const int dec64 = dec64table[offset]; op[0] = match[0]; op[1] = match[1]; op[2] = match[2]; op[3] = match[3]; match += dec32table[offset]; memcpy(op+4, match, 4); match -= dec64;
рдпрд╣ рдкрд╣рд▓реЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ, рдХреБрдЫ рдореИрдЬрд┐рдХ рдирдВрдмрд░ рд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рдЕрдЧрд▓реЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдЕрдиреНрдп рдореИрдЬрд┐рдХ рдирдВрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░реНрд╕рд░ рдХреЛ рдПрдХ рдореИрдЪ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдб рдХреЗ рд▓реЗрдЦрдХ (
рдпрд╛рди рдХреЛрд▓реЗрдЯ ) рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝рдирд╛ рднреВрд▓ рдЧрдП рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪрд░ рдирд╛рдо рднреНрд░рдорд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╡реЗ рджреЛрдиреЛрдВ рдирд╛рдо dec рд╣реИрдВ ... рддрд╛рд▓рд┐рдХрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ рдХреЛ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ int рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд▓реЗрдЦрдХ рдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХреЛрдб рдореЗрдВ рдЗрд╕ рд╕реНрдерд╛рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рдо рдкрд╣рд▓реЗ 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 an equivalent result, but is more CPU friendly for unknown reasons. 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
(рдкреИрдХреНрдб рд╢рдлрд▓ рдмрд╛рдЗрдЯреНрд╕) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ 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
рдПрдХ
рдЖрдВрддрд░рд┐рдХ рд╣реИ , рдЬреЛ
pshufb
CPU рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдХреНрдпрд╛ рд╣рдо рдирдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдмрд╛рд░ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рдСрдкрд░реЗрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЖрдЦрд┐рд░рдХрд╛рд░, SSSE3 рдПрдХ рдмрд╣реБрдд рдкреБрд░рд╛рдирд╛ рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рд╕реЗрдЯ рд╣реИ рдЬреЛ 2006 рдХреЗ рдЖрд╕рдкрд╛рд╕ рд░рд╣рд╛ рд╣реИред AVX2 рдореЗрдВ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рд╣реИ рдЬреЛ рдПрдХ рдмрд╛рд░ рдореЗрдВ 32 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд▓рдЧ-рдЕрд▓рдЧ 16-рдмрд╛рдЗрдЯ рд▓реЗрди рдХреЗ рд▓рд┐рдПред рдЗрд╕реЗ рдкреИрдХреНрдб рдлреЗрд░рдмрджрд▓ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмрдЬрд╛рдп рд╡реЗрдХреНрдЯрд░ рдкрд░рдорд┐рдЯ рдмрд╛рдЗрдЯреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╢рдмреНрдж рдЕрд▓рдЧ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрд░реНрде рд╕рдорд╛рди рд╣реИред AVX-512 VBMI рдореЗрдВ рдПрдХ рдФрд░ рдирд┐рд░реНрджреЗрд╢ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ 64 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрдП рд╣реИрдВред рдПрдЖрд░рдПрдо рдирд┐рдпреЙрди рдХреЗ рд╕рдорд╛рди рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ vtbl (рд╡реЗрдХреНрдЯрд░ рдЯреЗрдмрд▓ рд▓реБрдХрдЕрдк) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдХреЗрд╡рд▓ 8 рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, 8 рдмрд╛рдЗрдЯреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП 64-рдмрд┐рдЯ MMX рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде
pshufb
рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдпрд╣ рдХреЛрдб рдХреЗ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп (рдЧрдВрднреАрд░ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП) 16-рдмрд╛рдЗрдЯ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рд╣рд╛рдИрд▓реЛрдб + ++ рд╕рд╛рдЗрдмреЗрд░рд┐рдпрд╛ рд╕рдореНрдореЗрд▓рди рдореЗрдВ, рдПрдХ рдкреНрд░рддрд┐рднрд╛рдЧреА рдореЗрд░реА рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рдмрд╛рдж рдореЗрд░реЗ рдкрд╛рд╕ рдЖрдпрд╛ рдФрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдХрд┐ 8-рдмрд╛рдЗрдЯ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЪрдпрдирд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕реЗ рдЧреБрдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдкрдХреЛ рдСрдлрд╕реЗрдЯ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА) - рдпрд╣ рднреА рдирд╣реАрдВ рд╣реБрдЖ рдерд╛ рдореЗрд░реЗ рд╕рд╛рдордиреЗ!
рдХреИрд╕реЗ рдПрдХ рдЕрддрд┐рд╢рдпреЛрдХреНрддрд┐ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдХрдерди
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдореИрдВ рдПрдХ рдРрд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ 16 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИред рдореИрдВ рдмрдлрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рд╕реЗ рдХреИрд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реВрдВ?
рдореИрдВрдиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВ рдЕрднреА рдпрд╣ рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛ред рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдпрд╣ тАЛтАЛрдХрд╣реЗрдЧреА рдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рд╣рдо рд╡рд╣рд╛рдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрдЪрд░рд╛ рдкрдврд╝ рд╕рдХреЗрдВ рдФрд░ рд▓рд┐рдЦ рд╕рдХреЗрдВред рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рд╣реИред
рджрд░рдЕрд╕рд▓, рдЗрд╕рдХреЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЬрд┐рд╕ рдбреЗрдЯрд╛ рдХреЛ рд╣рдореЗрдВ рдбрд┐рдХрдореНрдкреНрд░реЗрд╕ рдХрд░рдирд╛ рд╣реИ, рд╡рд╣ рдкреНрд░рддреНрдпреЗрдХ 65,536 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмреНрд▓реЙрдХ рд╕реЗ рдмрдирддрд╛ рд╣реИред рддрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣рдореЗрдВ рд╕реНрдореГрддрд┐ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рдШрдЯрд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП 65,536 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред рд▓реЗрдХрд┐рди рдирдП рдлрд╝рдВрдХреНрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ 65,551 рдмрд╛рдЗрдЯреНрд╕ рд╡рд╛рд▓реЗ рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред рдлрд┐рд░ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 96 рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ 128 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдмрдВрдЯрдХ рдмрд╣реБрдд рдЦрд░рд╛рдм рд╣реИ, рддреЛ рдпрд╣ рдЕрдЪрд╛рдирдХ "рд╣реАрдк" рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ рдореЗрдореЛрд░реА рдХреЛ рдмрдВрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди (рдпрд╛
madvice
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрдореЛрд░реА рдЬрд╛рд░реА
madvice
) рдХреЗ рд▓рд┐рдП рд╣рд░ рдмрд╛рд░
munmap
рдФрд░
munmap
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдкреГрд╖реНрда рджреЛрд╖ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмреЗрд╣рдж рдзреАрдореА рд╣реЛрдЧреАред рдирддреАрдЬрддрди, рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдпрд╣ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╕рдм рдХреБрдЫ рдзреАрдорд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдХреНрдпрд╛ рдХреЛрдИ рддреЗрдЬреА рд╣реИ?
рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХреЛрдб рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдпрд╛ рдЬреЛ рддреАрди рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
- 8 рдХреЗ рдмрдЬрд╛рдп 16 рдмрд╛рдЗрдЯреНрд╕ рдХреЙрдкреА рдХрд░рдирд╛ред
offset < 16
рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдлреЗрд░рдмрджрд▓ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред- рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЕрдЧрд░ред
рдореИрдВрдиреЗ рдбреЗрдЯрд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрдЯреЛрдВ рдкрд░ рдЗрд╕ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд┐рдпрд╛ рдФрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдПред
рдЙрджрд╛рд╣рд░рдг 1:
Xeon E2650v2, Yandex Browser data, AppVersion рдХреЙрд▓рдоред
рд╕рдВрджрд░реНрдн: 1.67 рдЬреАрдмреА / рд╕реЗрдХрдВрдбред
16 рдмрд╛рдЗрдЯреНрд╕, рдлреЗрд░рдмрджрд▓: 2.94 рдЬреАрдмреА / рд╕реЗрдХ (76% рддреЗрдЬ)ред
рдЙрджрд╛рд╣рд░рдг 2:
Xeon E2650v2, Yandex рдбрд╛рдпрд░реЗрдХреНрдЯ рдбреЗрдЯрд╛, рд╢реЛрд╕рдордкрд┐рд╢рди рдХреЙрд▓рдоред
рд╕рдВрджрд░реНрдн: 2.30 рдЬреАрдмреА / рд╕реЗрдХрдВрдбред
16 рдмрд╛рдЗрдЯреНрд╕, рдлреЗрд░рдмрджрд▓: 1.91 рдЬреАрдмреА / рд╕реЗрдХрдВрдб (20% рдзреАрдореА)ред
рдореИрдВ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рдмрд╣реБрдд рдЦреБрд╢ рдерд╛, рдЬрдм рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЗрддрдиреЗ рдмрдбрд╝реЗ рдкреНрд░рддрд┐рд╢рдд рд╕реЗ рд╕рдм рдХреБрдЫ рддреЗрдЬ рд╣реЛ рдЧрдпрд╛ рдерд╛ред рддрдм рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рддреЗрдЬ рдирд╣реАрдВ рдерд╛ред рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдпрд╣ рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рднреА рдерд╛ред рдореИрдВрдиреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, 16 рдмрд╛рдЗрдЯреНрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рд▓рд╛рдн рдЙрддрдирд╛ рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ред рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ: рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛, рдЯреБрдХрдбрд╝реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд╕рдд рд▓рдВрдмрд╛рдИ рд▓рдВрдмреА рд╣реЛрдЧреАред
рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЪрд╛рд░ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП C ++ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛: 8-рдмрд╛рдЗрдЯ рдпрд╛ 16-рдмрд╛рдЗрдЯ рд╡рд┐рдЦрдВрдбреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдФрд░ рдлреЗрд░рдмрджрд▓ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдпрд╛ рдмрд┐рдирд╛ред
template <size_t copy_amount, bool use_shuffle> void NO_INLINE decompressImpl( const char * const source, char * const dest, size_t dest_size)
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЛрдб рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╡реЗрд░рд┐рдПрдВрдЯ рдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЬрдм рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рддреЛ рдлреЗрд░рдмрджрд▓ рд╡рд╛рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣рдореЗрд╢рд╛ рдЬреАрддрд╛ред рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
sudo echo 'performance' | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor kill -STOP $(pidof firefox) $(pidof chromium)
рдлрд┐рд░ рдореИрдВ рдкреБрд░рд╛рдиреЗ "рд╡рд┐рдХрд╛рд╕" рд╕рд░реНрд╡рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ (рдПрдХреНрд╕реЛрди E5645 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде) рдкрд░ рдЧрдпрд╛, рдФрд░ рднреА рдЕрдзрд┐рдХ рдбреЗрдЯрд╛рд╕реЗрдЯ рд▓рд┐рдпрд╛, рдФрд░ рд▓рдЧрднрдЧ рд╡рд┐рдкрд░реАрдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП, рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреНрд░рдорд┐рдд рдХрд░ рджрд┐рдпрд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЗрд╖реНрдЯрддрдо рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╕рдВрдкреАрдбрд╝рди рдЕрдиреБрдкрд╛рдд рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЙрдбрд▓ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдкреНрд░реЛрд╕реЗрд╕рд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдлреЗрд░рдмрджрд▓ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЬрдм рдпрд╣ 16-рдмрд╛рдпреЛрдкрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдбред
рд╡реИрд╕реЗ, рдЬрдм рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ:
sudo kill -STOP $(pidof python) $(pidof perl) $(pgrep -u skynet) $(pidof cqudp-client)
рдЕрдиреНрдпрдерд╛, рдкрд░рд┐рдгрд╛рдо рдЕрд╕реНрдерд┐рд░ рд╣реЛрдВрдЧреЗред рдерд░реНрдорд▓ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рдФрд░ рдкрд╛рд╡рд░ рдХреИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рднреА рджреЗрдЦреЗрдВред
рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреИрд╕реЗ рдЪреБрдиреЗрдВ
рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЪрд╛рд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рд╢рд░реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдПрдХ рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдбреЗрдЯрд╛ рдФрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХрд╛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕реЗрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЧрдВрднреАрд░ рд▓реЛрдб рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдФрд╕рдд рдкрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдбреЗрдЯрд╛рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ
Yandex Metrica , Yandex Direct, Yandex Browser рдФрд░
рд╕рдВрдпреБрдХреНрдд рд░рд╛рдЬреНрдп рдЕрдореЗрд░рд┐рдХрд╛ рдореЗрдВ рдЙрдбрд╝рд╛рдиреЛрдВ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдирдореВрдирд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ ClickHouse рдХрд╛ рдЙрдкрдпреЛрдЧ рджреБрдирд┐рдпрд╛ рднрд░ рдХреА рд╕реИрдХрдбрд╝реЛрдВ рдХрдВрдкрдирд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рдЕрдзрд┐рдХ-рдЕрдиреБрдХреВрд▓рди рдХрд░рдХреЗ, рд╣рдо рдЕрдиреНрдп рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдорд╣рд╕реВрд╕ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЕрдЧрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЙрдбрд▓ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреЛрдб рдореЗрдВ рд╢рд░реНрддреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбрд▓ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╛ рд╕рдордп рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдкрд░ рд╕рдВрджрд░реНрдн рдореИрдиреБрдЕрд▓ рд╕реЗ рдкрд░рд╛рдорд░реНрд╢ рдХрд░реЗрдВ, рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ?)ред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдФрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рд╣рдорд╛рд░реЗ рд╕реНрдХреВрд▓ рдСрдл рдбреЗрдЯрд╛ рдПрдирд╛рд▓рд┐рд╕рд┐рд╕ рдореЗрдВ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реИ:
"рдмрд╣реБ-рд╕рд╢рд╕реНрддреНрд░ рдбрд╛рдХреВ" ред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдо рдЙрддреНрддрд░реЛрддреНрддрд░ рдЕрдзрд┐рдХ рдмреЗрд╣рддрд░ рдЪреБрдирдиреЗ рд╡рд╛рд▓реЗ рдЖрдВрдХрдбрд╝реЛрдВ рдХрд╛ рдЙрддреНрддрд░реЛрддреНрддрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рдХреЗ рдХрдИ рдмреНрд▓реЙрдХ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдбрд┐рдХрдореНрдкреНрд░реЗрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдбрд┐рдХрдореНрдкреНрд░реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рд╕реЗ рдПрдХ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЛ рдорд╛рдк рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рдПрдХ рдмреНрд▓реЙрдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рднреА рдЦрд░реНрдЪ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ ClickHouse рдореЗрдВ рдЕрд╕рдореНрдкреАрдбрд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ рдХрдо рд╕реЗ рдХрдо 64 KB рд╣реИред (рд╕рдордп рдорд╛рдкрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣
рд▓реЗрдЦ рдкрдврд╝реЗрдВред)
"рдорд▓реНрдЯреА-рд╕рд╢рд╕реНрддреНрд░ рдбрд╛рдХреВ" рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреА рдмреЗрд╣рддрд░ рд╕рдордЭ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдирд╛рдо рдХрд╣рд╛рдВ рд╕реЗ рдЖрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдХреИрд╕реАрдиреЛ рдореЗрдВ рд╕реНрд▓реЙрдЯ рдорд╢реАрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рдирддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рд▓реАрд╡рд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдХреБрдЫ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░рд╛рд╢рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреАрдВрдЪ рд╕рдХрддрд╛ рд╣реИред рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд┐рд╕реА рднреА рдХреНрд░рдо рдореЗрдВ рдХрдИ рдмрд╛рд░ рд▓реАрд╡рд░ рдХреЛ рдЦреАрдВрдЪ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд▓реАрд╡рд░ рдХреЛ рджрд┐рдП рдЧрдП рдзрди рдХреА рд╕рдВрдмрдВрдзрд┐рдд рд░рд╛рд╢рд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЦрд┐рд▓рд╛рдбрд╝реА рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдЦреЗрд▓ рдЦреЗрд▓рдиреЗ рдХреЗ рдЕрдиреБрднрд╡ рд╕реЗ рдЗрд╕реЗ рд╕реАрдЦ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдЬрдм рд╡реЗ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдЕрдкрдиреА рдЬреАрдд рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрдирд╛рдо рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд┐рдЫрд▓реЗ рдЪрд░рдгреЛрдВ рд╕реЗ рдЦреЗрд▓ рдХреЗ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд▓реАрд╡рд░ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡реНрдпрддрд╛ рд╡рд┐рддрд░рдг рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рд╣реИред рддрдм рд╣рдо рдорд╛рдирд╕рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╡рд┐рддрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рд▓реАрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЗрдирд╛рдо "рдЬреАрдд" рд▓реЗрддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рд╣рдо рд▓реАрд╡рд░ рдХреЛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рд╣рдорд╛рд░реЗ рдорд╛рдирд╕рд┐рдХ рдЦреЗрд▓ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рдерд╛ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдереЙрдореНрдкрд╕рди рдирдореВрдирд╛рдХрд░рдг рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рд╡рд┐рдШрдЯрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЪрдпрди рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдо рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ picoseconds рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдордп рд╣реИ: рдХрдо, рдмреЗрд╣рддрд░ред рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдордп рдХреЛ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд░ рдорд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдЧрдгрд┐рддреАрдп рдЖрдБрдХрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рд╡рд┐рддрд░рдг рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВрдЧреЗред рдмрд╛рдпреЗрд╕рд┐рдпрди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдЯрд┐рд▓ рд╕реВрддреНрд░реЛрдВ рдХреЛ C ++ рдХреЛрдб рдореЗрдВ рдбрд╛рд▓рдирд╛ рдмреЛрдЭрд┐рд▓ рд╣реЛрдЧрд╛ред рд╣рдо рдПрдХ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдкрд░рд┐рд╡рд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВред
рд╣рдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЪрд░ рдХреЗ рдкрд░рд┐рд╡рд╛рд░ рдХрд╛ рдЪрдпрди рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ? рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рддрд░рдг рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЧрд▓рдд рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдирдХрд╛рд░рд╛рддреНрдордХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рддрд░рдг рд╕рдВрдЦреНрдпрд╛ рд░реЗрдЦрд╛ рдкрд░ рд╣рд░ рдЬрдЧрд╣ рдорд╛рди рд▓реЗрддрд╛ рд╣реИред рджреВрд╕рд░рд╛, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЗ рджрд╛рд╣рд┐рдиреЗ рдЫреЛрд░ рдкрд░ рдПрдХ рднрд╛рд░реА "рдкреВрдВрдЫ" рд╣реЛрдЧреАред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕реЗ рдХрд╛рд░рдХ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдереЙрдореНрдкрд╕рди рдирдореВрдирд╛рдХрд░рдг рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рддрд░рдг рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд▓рдХреНрд╖реНрдп рдЪрд░ рдХрд╛ рд╡рд┐рддрд░рдг рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ)ред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЧрдгрд┐рддреАрдп рдЕрдкреЗрдХреНрд╖рд╛ рдФрд░ рднрд┐рдиреНрдирддрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рддрд░рдг рдХрд╛рдлреА рд╕рдВрдХреАрд░реНрдг рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрди рд╡рд┐рддрд░рдгреЛрдВ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдо рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рд╣рдо рдкрд╣рд▓реЗ рдЪрд░рдгреЛрдВ рдореЗрдВ рдЕрднрд┐рд╕рд░рдг рджрд░ рд╕реЗ рдмрд╣реБрдд рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЗрди рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
This may seem like a somewhat ignorant approach. Experience has shown us that the average time for query execution, website page loading, and so on is "garbage" that isn't worth calculating. It would be better to calculate the median, which is a
robust statistic . But this is a little more difficult, and as I will show later, the described method justifies itself for practical purposes.
At first I implemented calculation of the mathematical expectation and variance, but then I decided that this is too good, and I need to simplify the code to make it "worse":
/// For better convergence, we don't use proper estimate of stddev. /// We want to eventually separate the two algorithms even in cases /// 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); }
I wrote it so that the first few iterations were not taken into account, to eliminate the effect of memory latencies.
The result is a test program that can select the best algorithm for the input data, with optional modes that use the reference implementation of LZ4 or a specific version of the algorithm.
So there are six options:
тАФ Reference (baseline): original LZ4 without our modifications.
тАФ Variant 0: copy 8 bytes at a time without shuffle.
тАФ Variant 1: copy 8 bytes at a time with shuffle.
тАФ Variant 2: copy 16 bytes at a time without shuffle.
тАФ Variant 3: copy 16 bytes at a time with shuffle.
тАФ The "bandit" option, which selects the best of the four optimized variants.
Testing on different CPUs
If the result strongly depends on the CPU model, it would be interesting to find out exactly how it is affected. There might be an exceptionally large difference on certain CPUs.
I prepared a set of datasets from different tables in ClickHouse with real data, for a total of 256 different files each with 100 MB of uncompressed data (the number 256 was coincidental). Then I looked at the CPUs of the servers where I can run benchmarks. I found servers with the following CPUs:
тАФ 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
The most interesting part comes next тАФ the processors provided by the R&D department:
тАФ AMD EPYC 7351 16-Core Processor, a new AMD server processor.
тАФ Cavium ThunderX2, which is AArch64, not x86. For these, my SIMD optimization needed to be reworked a bit. The server has 224 logical and 56 physical cores.
There are 13 servers in total, and each of them runs the test on 256 files in 6 variants (reference, 0, 1, 2, 3, adaptive). The test is run 10 times, alternating between the options in random order. It outputs 199,680 results that we can compare.
For example, we can compare different CPUs with each other. But we shouldn't jump to conclusions from these results, because we are only testing the LZ4 decompression algorithm on a single core (this is a very narrow case, so we only get a micro-benchmark). For example, the Cavium has the lowest performance per single core. But I tested ClickHouse on it myself, and it wins out over Xeon E5-2650 v2 on heavy queries due to the greater number of cores, even though it is missing many optimizations that are made in ClickHouse specifically for the 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 тАФ The speed in gigabytes per second (the value that is the reverse of the arithmetic mean of time for all launches on all datasets).
- best тАФ The number of the best algorithm among the optimized variants, from 0 to 3.
- adapt_boost тАФ The relative advantage of the adaptive algorithm compared to the baseline.
- max_boost тАФ The relative advantage of the best of the non-adaptive variants compared to the baseline.
- adapt_over_max тАФ The relative advantage of the adaptive algorithm over the best non-adaptive one.
The results show that we were able to speed up decompression by 12-20% on modern x86 processors. Even on ARM we saw 4% improvement, despite the fact that we didn't optimize much for this architecture. It is also clear that on average for different datasets, the "bandit" algorithm comes out ahead of the pre-selected best variant on all processors (except for very old Intel CPUs).
рдирд┐рд╖реНрдХрд░реНрд╖
In practice, the usefulness of this work is dubious. Yes, LZ4 decompression was accelerated on average by 12-20%, and on some datasets the performance more than doubled. But in general, this doesn't have much effect on query execution time. It's difficult to find real queries that gain more than a couple percent in speed.
We decided to use ZStandard level 1 instead of LZ4 on several Yandex Metrica clusters intended for executing long queries, because it is more important to save IO and disk space on cold data. Keep this in mind if you have similar workload.
We observed the greatest benefits from optimizing decompression in highly compressible data, such as columns with mostly duplicate string values. However, we have developed a separate solution specifically for this scenario that allows us to significantly speed up queries over this kind of data.
Another point to remember is that optimization of decompression speed is often limited by the format of the compressed data. LZ4 uses a very good format, but Lizard, Density and LZSSE have other formats that can work faster. Perhaps instead of trying to accelerate LZ4, it would be better to just integrate LZSSE into ClickHouse.
It's unlikely that these optimizations will be implemented in the mainstream LZ4 library: in order to use them, the library interface would have to be modified. In fact, this is often the case with improving algorithms тАФ optimizations don't fit into old abstractions and they have to be revised. However, variable names have already been corrected in the original implementation. For instance, inc and dec tables have been
corrected . In addition, about a month ago, the original implementation accelerated decompression by the same 12-15% by copying 32 bytes instead of 16, as discussed above. We tried the 32-byte option ourselves and the results were not that great, but they were still
faster .
If you look at the profile at the beginning of the article, you may notice that we could have removed one extra copying operation from the page cache to userspace (either using
mmap
, or using
O_DIRECT
and userspace page cache, but both options are problematic). We also could have slightly improved the checksum calculation (CityHash128 is currently used without CRC32-C, but we could use HighwayHash, FARSH or XXH3). Acceleration of these two operations is useful for weakly compressed data, since they are performed on compressed data.
In any case, the changes have already been added to master more than a year ago, and the ideas that resulted from this research have been applied in other tasks. You can also watch the
video from HighLoad++ Siberia, or view the
presentation (both in Russian).