рдЬрд╛рдУ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рддрд░реАрдХреЗ

рдореБрдЭреЗ рд╣рдореЗрд╢рд╛ рдкреНрд░рджрд░реНрд╢рди рдХреА рдкрд░рд╡рд╛рд╣ рд╣реИред рдореБрдЭреЗ рдареАрдХ-рдареАрдХ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВред рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд┐рд░реНрдл рдзреАрдореА рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рд╕реЗ рдирд╛рд░рд╛рдЬ рд╣реЛ рдЬрд╛рддрд╛ рд╣реВрдВред рд▓рдЧрддрд╛ рд╣реИ рдореИрдВ рдЕрдХреЗрд▓рд╛ рдирд╣реАрдВ рд╣реВрдБ ред

рдП / рдмреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ, рд╣рдордиреЗ 100 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреА рд╡реГрджреНрдзрд┐ рдореЗрдВ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЛ рдзреАрдорд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдкрд╛рдпрд╛ рдХрд┐ рдмрд╣реБрдд рдХрдо рджреЗрд░реА рд╕реЗ рд░рд╛рдЬрд╕реНрд╡ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЧрд┐рд░рд╛рд╡рдЯ рдЖрддреА рд╣реИред - рдЧреНрд░реЗрдЧ рд▓рд┐рдВрдбреЗрди, Amazon.com

рдЕрдиреБрднрд╡ рд╕реЗ, рдХрдо рдЙрддреНрдкрд╛рджрдХрддрд╛ рджреЛ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИ:

  • рдЫреЛрдЯреЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдЪрд╛рд▓рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдмрдврд╝рддреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░ рдпреЗ O (N) рдпрд╛ O (N are) рдСрдкрд░реЗрд╢рди рд╣реЛрддреЗ рд╣реИрдВред рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЖрдзрд╛рд░ рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрддреНрдкрд╛рдж рдмрд╛рдЬрд╛рд░ рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рдЬрд▓реНрджреА рдореЗрдВ рд╣реИред рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдЖрдзрд╛рд░ рдмрдврд╝рддрд╛ рд╣реИ, рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реЛрдЧ рд╕рдВрдмрдВрдзреА рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдкреИрджрд╛ рд╣реЛрддреА рд╣реИрдВ - рдФрд░ рд╕реЗрд╡рд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИред
  • рдЙрдк-рд░реВрдкреА рдХрд╛рдо рдХреЗ рдХрдИ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реНрд░реЛрдд, "рдПрдХ рд╣рдЬрд╛рд░ рдХрдЯреМрддреА рд╕реЗ рдореМрддред"

рдЕрдкрдиреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд░рд┐рдпрд░ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдпрд╛ рддреЛ рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рд╕рд╛рдЗрдВрд╕ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдпрд╛ рдЧреЛ рдкрд░ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ред рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдЕрдиреБрдХреВрд▓рди рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡ рд╣реИред рдЧреЛ рдЖрдорддреМрд░ рдкрд░ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдЕрдбрд╝рдЪрди рдирд╣реАрдВ рд╣реИ - рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдХреНрд╕рд░ I / O рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдмреИрдЪ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдореИрдВрдиреЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдХреНрд╕рд░ рд╕реАрдкреАрдпреВ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ Go рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд┐рднрд┐рдиреНрди рд░рдгрдиреАрддрд┐рдпрд╛рдБ рд╣реИрдВред

рдпрд╣ рд▓реЗрдЦ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рдирд╛ рдЕрдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рдХреЗ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдпрд╛рд╕ рдпрд╛ рдмрдбрд╝реЗ рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ


рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХреЛрдИ рднреА рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреБрдХреНрдд рдЖрдзрд╛рд░ рд░реЗрдЦрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓реЗрдВред рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдВрдзреЗрд░реЗ рдореЗрдВ рднрдЯрдХреЗрдВрдЧреЗ, рд╕реЛрдЪреЗрдВрдЧреЗ рдХрд┐ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдХреЛрдИ рд▓рд╛рдн рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд▓рд┐рдЦрд┐рдП рдФрд░ рдкреНрд░реЛрдлрд┐рдЯ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдлрд╛рдЗрд▓ рд▓реАрдЬрд┐рдПред рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЛ рднреА рдЧреЛ рдкрд░ рд▓рд┐рдЦрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ : рдЗрд╕рд╕реЗ рдкреАрд░рд┐рдЯ рдФрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдмреЗрдВрдЪрдХреИрдВрдк рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмреАрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдЕрдВрддрд░ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧреА рдЙрдкрдХрд░рдгред

рдпрджрд┐ рдХреЛрдб рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдмрд╕ рдЙрд╕ рдЪреАрдЬрд╝ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдорд╛рдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рд░рдирдЯрд╛рдЗрдо / рдкреАрдЯреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИ!

рдкрд╣рд▓реЗ рдЪрдпрдирд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Sync.Pool рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


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

var bufpool = sync.Pool{ New: func() interface{} { buf := make([]byte, 512) return &buf }} 

рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдкреВрд▓ рд╕реЗ Put() рдФрд░ Put() рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реЛрдВред

 // sync.Pool returns a interface{}: you must cast it to the underlying type // before you use it. b := *bufpool.Get().(*[]byte) defer bufpool.Put(&b) // Now, go do interesting things with your byte buffer. buf := bytes.NewBuffer(b) 

рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВред 1.13 рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдкреВрд▓ рдХреЛ рд╣рд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рд╕рд╛рдл рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдЙрди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдкреНрд░рддрд┐рдХреВрд▓ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рд╕рд╛рд░реА рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВред 1.13 рддрдХ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рд╡рд╕реНрддреБрдПрдВ рдЬреАрд╕реА рдХреЗ рдмрд╛рдж рдмрдЪ рдЬрд╛рддреА рд╣реИрдВ ред

!!! рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреВрд▓ рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕рдВрд░рдЪрдирд╛ рдлрд╝реАрд▓реНрдб рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрд╕ рдкреВрд▓ рд╕реЗ рдПрдХ рдЧрдВрджреА рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдбреЗрдЯрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЧрдВрднреАрд░ рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдЦрд┐рдо рд╣реИ!

 type AuthenticationResponse { Token string UserID string } rsp := authPool.Get().(*AuthenticationResponse) defer authPool.Put(rsp) // If we don't hit this if statement, we might return data from other users! if blah { rsp.UserID = "user-1" rsp.Token = "super-secret" } return rsp 

рд╢реВрдиреНрдп рдореЗрдореЛрд░реА рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХрд╛ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд░реЗрдВ:

 // reset resets all fields of the AuthenticationResponse before pooling it. func (a* AuthenticationResponse) reset() { a.Token = "" a.UserID = "" } rsp := authPool.Get().(*AuthenticationResponse) defer func() { rsp.reset() authPool.Put(rsp) }() 

рдПрдХрдорд╛рддреНрд░ рдорд╛рдорд▓рд╛ рдЬрдм рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдЬрдм рдЖрдк рд▓рд┐рдЦреА рдЧрдИ рд╕рдЯреАрдХ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 var ( r io.Reader w io.Writer ) // Obtain a buffer from the pool. buf := *bufPool.Get().(*[]byte) defer bufPool.Put(&buf) // We only write to w exactly what we read from r, and no more. nr, er := r.Read(buf) if nr > 0 { nw, ew := w.Write(buf[0:nr]) } 

рдПрдХ рдмрдбрд╝реЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдпреБрдХреНрдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВ


рдлреВрд╣, рдореИрдВ рднреА рд╡рд╛рдЪрд╛рд▓ рдерд╛ред рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рд╡реЗ рдЕрдХреНрд╕рд░ (рдореЗрд░реЗ рдкреВрд░реНрд╡ рд╕рд╣рдпреЛрдЧреА рдлрд┐рд▓ рдкрд░реНрд▓ рд╕рд╣рд┐рдд) рдмрдбрд╝реЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдЧреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рдереЗред рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рджреМрд░рд╛рди, рд░рдирдЯрд╛рдЗрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╕реЗ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдорд╛рдирдЪрд┐рддреНрд░ map[string]int , рддреЛ рдЬреАрд╕реА рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╣рд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╕рдВрдХреЗрдд рд╣реЛрддреЗ рд╣реИрдВред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо 10 рдорд┐рд▓рд┐рдпрди рддрддреНрд╡реЛрдВ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ map[string]int рд▓рд┐рдП рдФрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреА рдЕрд╡рдзрд┐ рдХреЛ рдорд╛рдкрддреЗ рд╣реИрдВред рд╣рдо рдвреЗрд░ рд╕реЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрдкрдирд╛ рдирдХреНрд╢рд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

 package main import ( "fmt" "runtime" "strconv" "time" ) const ( numElements = 10000000 ) var foo = map[string]int{} func timeGC() { t := time.Now() runtime.GC() fmt.Printf("gc took: %s\n", time.Since(t)) } func main() { for i := 0; i < numElements; i++ { foo[strconv.Itoa(i)] = i } for { timeGC() time.Sleep(1 * time.Second) } } 

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЪрд▓рд╛рдиреЗ рдкрд░, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:

  inthash тЖТ go рдЗрдВрд╕реНтАНрдЯреЙрд▓ && inthash
 gc рд▓рд┐рдпрд╛: 98.726321ms
 gc рд▓рд┐рдпрд╛: 105.524633ms
 gc рд▓рд┐рдпрд╛: 102.829451ms
 gc рд▓рд┐рдпрд╛: 102.71908ms
 gc рд▓рд┐рдпрд╛: 103.084104ms
 gc рд▓рд┐рдпрд╛: 104.821989ms 

рдХрдВрдкреНрдпреВрдЯрд░ рджреЗрд╢ рдореЗрдВ рдпрд╣ рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╕рдордп рд╣реИ!

рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рд╣рд░ рдЬрдЧрд╣ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╣рдЯрд╛рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рддрд╛рдХрд┐ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рд▓реЛрдб рди рдХрд┐рдпрд╛ рдЬрд╛рдПред рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╕рдВрдХреЗрдд рд╣реИрдВ ; рддреЛ рдЪрд▓рд┐рдП рдЗрд╕реЗ map[int]int рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

 package main import ( "fmt" "runtime" "time" ) const ( numElements = 10000000 ) var foo = map[int]int{} func timeGC() { t := time.Now() runtime.GC() fmt.Printf("gc took: %s\n", time.Since(t)) } func main() { for i := 0; i < numElements; i++ { foo[i] = i } for { timeGC() time.Sleep(1 * time.Second) } } 

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдирд╛, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ:

  inthash тЖТ go рдЗрдВрд╕реНтАНрдЯреЙрд▓ && inthash
 gc рд▓рд┐рдпрд╛: 3.608993ms
 gc рд▓рд┐рдпрд╛: 3.926913ms
 gc рд▓рд┐рдпрд╛: 3.955706ms
 gc рд▓рд┐рдпрд╛: 4.063795ms
 gc рд▓рд┐рдпрд╛: 3.91519ms
 gc рд▓рд┐рдпрд╛: 3.75226ms 

рдмрд╣реБрдд рдмреЗрд╣рддрд░ред рд╣рдордиреЗ 35 рдмрд╛рд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдг рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдИ рд╣реИред рдЬрдм рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрд╛рд░реНрдб рдореЗрдВ рдбрд╛рд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддрд╛рд░ рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рд╣реИрд╢ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред

рд╡реИрд╕реЗ, рдЬреАрд╕реА рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдХрдИ рдФрд░ рддрд░реАрдХреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╡реНрдпрд░реНрде рд╕рдВрд░рдЪрдирд╛рдУрдВ, ints рдпрд╛ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╡рд┐рд╢рд╛рд▓рдХрд╛рдп рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЬреАрд╕реА рдЗрд╕реЗ рд╕реНрдХреИрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ : рдЕрд░реНрдерд╛рдд, рдЖрдк рдЬреАрд╕реА рд╕рдордп рдкрд░ рдмрдЪрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрд╢реЛрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдЬ рд╣рдо рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗред

рдХрд┐рд╕реА рднреА рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде, рдкреНрд░рднрд╛рд╡ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдПрдХ рдмрдбрд╝реЗ рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдореГрддрд┐ рдХреА рдЦрдкрдд рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдбреЗрдорд┐рдпрди рдЧреНрд░рд╛рдЗрд╕реНрдХреА рдХреЗ рдЯреНрд╡реАрдЯреНрд╕ рдХреЗ рдзрд╛рдЧреЗ рдХреЛ рджреЗрдЦреЗрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡рд╣ рд╕рдм рдХреБрдЫ рдкрдврд╝реЗрдВ рдЬреЛ рд╡рд╣ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рд░рдирдЯрд╛рдЗрдо рдкрд░рд╛рд╡рд░реНрддрди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХреА рдорд╛рд░реНрдХрд╢реАрдЯ


JSON рдЬреИрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рд░реВрдкреЛрдВ рдореЗрдВ рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдорд╛рд░реНрд╢реЗрд▓ рдХрд░рдирд╛ рдФрд░ рдЕрдирдорд░реНрд╢ рдХрд░рдирд╛, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдкрд░реЗрд╢рди рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдореИрдЯреНрд░реЛрдЬрд╝ рд╕рд░реНрд╡рд┐рд╕реЗрдЬрд╝ рдмрдирд╛рддреЗ рд╣реИрдВред рдХрдИ microservices рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдПрдХрдорд╛рддреНрд░ рдХрд╛рдо рд╣реИред json.Marshal рдФрд░ json.Unmarshal рдЬреИрд╕реЗ рдХрд╛рд░реНрдп рдмрд╛рдЗрдЯреНрд╕ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╕реНрдкрд╖реНрдЯ рдХреЛрдб рдЬрд┐рддрдирд╛ рдХреБрд╢рд▓ рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред JSON рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдореИрдХреЗрдирд┐рдХреНрд╕ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 package json // Marshal take an object and returns its representation in JSON. func Marshal(obj interface{}) ([]byte, error) { // Check if this object knows how to marshal itself to JSON // by satisfying the Marshaller interface. if m, is := obj.(json.Marshaller); is { return m.MarshalJSON() } // It doesn't know how to marshal itself. Do default reflection based marshallling. return marshal(obj) } 

рдпрджрд┐ рд╣рдо JSON рдореЗрдВ рдорд╛рд░реНрд╢рд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд░рд╛рдЧ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рд╕рднреА рдорд╛рд░реНрд╢рд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ рдпрд╣ рдХреЛрдб рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рджреЗрдВ! рдХреЛрдб рдЬреЗрдирд░реЗрдЯрд░ рдЬреИрд╕реЗ рдХрд┐ рдИрдЬреАрд╕рди рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ json.Marshaller рдЬреИрд╕реЗ рдореМрдЬреВрджрд╛ json.Marshaller рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИред

рдкреИрдХреЗрдЬ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ $file.go рдореЗрдВ рдирд┐рдореНрди рдХрдорд╛рдВрдб $file.go , рдЬрд┐рд╕рдореЗрдВ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЖрдк рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

  easyjson -all $ file.go 

рдлрд╝рд╛рдЗрд▓ $file_easyjson.go рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ easyjson рдЖрдкрдХреЗ рд▓рд┐рдП json.Marshaller рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдмрдЬрд╛рдп рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдмрдзрд╛рдИ: рдЖрдкрдиреЗ рддреАрди рдмрд╛рд░ рдЕрдкрдирд╛ JSON рдХреЛрдб рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ред рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХреЛ рдФрд░ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░рдХреАрдмреЗрдВ рд╣реИрдВред

рдореИрдВ рдЗрд╕ рдкреИрдХреЗрдЬ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдЦреБрдж рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХред рд▓реЗрдХрд┐рди рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред рдХреГрдкрдпрд╛ рдЗрд╕реЗ рд╕рдмрд╕реЗ рддреЗрдЬ JSON рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рд╕рд╛рде рдЖрдХреНрд░рд╛рдордХ рдмрд╣рд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдирд┐рдордВрддреНрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рди рд▓реЗрдВред

рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдиреЗ рдкрд░ рдорд╛рд░реНрд╢рд┐рдВрдЧ рдХреЛрдб рдХреЛ рдкреБрди: рдЬреЗрдирд░реЗрдЯ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдирдП рдЬреЛрдбрд╝реЗ рдЧрдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рднреНрд░рдо рдкреИрджрд╛ рд╣реЛрдЧрд╛! рдЖрдк рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП go generate рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдЯ рдкрд░ generate.go рдХреЛ рд╕реНрдерд╛рди рджреЗрдирд╛ рдкрд╕рдВрдж generate.go рд╣реВрдВ, рдЬреЛ рд╕рднреА рдкреИрдХреЗрдЬ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП go generate рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рддрдм рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реА рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореБрдЦреНрдп рдЯрд┐рдк: рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдЕрджреНрдпрддрди рд╣реИрдВ, рдХреЙрд▓ рд╕реАрдЖрдИ рдореЗрдВ go generate рдХрд░реЗрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдкрдВрдЬреАрдХреГрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред

рддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


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

1.10 рд▓рд╛рдЧреВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдкрд░ рдЬрд╛рдПрдВред рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреБрд╢рд▓ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдмреНрд░реИрд╕реНрдЯ ред рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣ рдПрдХ рдмрд╛рдЗрдЯ рдмрдлрд░ рдХреЛ рд▓рд┐рдЦрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рддрдм рдЬрдм рдмрд┐рд▓реНрдбрд░ рдореЗрдВ String() рдХреЙрд▓рд┐рдВрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдирд╛рддрд╛ рд╣реИред рд╡рд╣ рдмреЗрд╕ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдПрдХ рд╢реВрдиреНрдп рдЖрд╡рдВрдЯрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЪрд╛рд▓ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ: рдЗрд╕ рдмреНрд▓реЙрдЧ рдХреЛ рдЖрдЧреЗ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ:

 // main.go package main import "strings" var strs = []string{ "here's", "a", "some", "long", "list", "of", "strings", "for", "you", } func buildStrNaive() string { var s string for _, v := range strs { s += v } return s } func buildStrBuilder() string { b := strings.Builder{} // Grow the buffer to a decent length, so we don't have to continually // re-allocate. b.Grow(60) for _, v := range strs { b.WriteString(v) } return b.String() } 

 // main_test.go package main import ( "testing" ) var str string func BenchmarkStringBuildNaive(b *testing.B) { for i := 0; i < bN; i++ { str = buildStrNaive() } } func BenchmarkStringBuildBuilder(b *testing.B) { for i := 0; i < bN; i++ { str = buildStrBuilder() } 

рдпрд╣рд╛рдБ рдореЗрд░реЗ рдореИрдХрдмреБрдХ рдкреНрд░реЛ рдкрд░ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:

  strbuild -> go test -bench =ред  -benchmem
 goos: рдбрд╛рд░реНрд╡рд┐рди
 goarch: amd64
 pkg: github.com/sjwhitworth/perfblog/strbuild
 BenchmarkStringBuildNaive-8 5,000,000 255 ns / op 216 B / op 8 allocs / op
 рдмреЗрдВрдЪрдорд╛рд░реНрдХрд╕реНрдЯреНрд░рд┐рдВрдЧрдмреАрд▓реНрдбрдмреБрд▓реНрдЯ -8 20,000,000 54.9 ns / op 64 B / op 1 рдСрд▓реЛрдХреЛрдЬрд╝ рдФрд░ рдкреНрд░рддрд┐ рдСрдкреНрд╕ 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, strings.Builder 4.7 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИ, рдЖрда рдмрд╛рд░ рдХрдо рдЖрд╡рдВрдЯрди рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдФрд░ рдЪрд╛рд░ рдЧреБрдирд╛ рдХрдо рдореЗрдореЛрд░реА рд▓реЗрддрд╛ рд╣реИред

рдЬрдм рдкреНрд░рджрд░реНрд╢рди рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, strings.Builder рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рдЗрд╕реЗ рд╣рд░ рдЬрдЧрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ рдЗрдорд╛рд░рдд рдХреЗ рд╕рдмрд╕реЗ рддреБрдЪреНрдЫ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ред

Fmt рдХреЗ рдмрдЬрд╛рдп strconv рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


fmt рдЧреЛ рдореЗрдВ рд╕рдмрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рдкреИрдХреЗрдЬ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЖрдкрдиреЗ рд╢рд╛рдпрдж "рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдЬрдм рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рддреИрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЙрд╕рдХреЗ рдЫреЛрдЯреЗ рднрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрд╢рд▓ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкреИрдХреЗрдЬ API рдореЗрдВ рдмрд╣реБрдд рдХрдо рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рджрд┐рдЦрд╛рддрд╛ рд╣реИред

fmt рдореВрд▓ рд░реВрдк рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ interface{} рд▓реЗрддрд╛ рд╣реИред рджреЛ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ:

  • рдЖрдк рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдЦреЛ рд░рд╣реЗ рд╣реИрдВред рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
  • рдЗрд╕рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╕реНрд░рд╛рд╡ рдХреА рдорд╛рддреНрд░рд╛ рдмрдврд╝ рд╕рдХрддреА рд╣реИред рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдмрд┐рдирд╛ рдПрдХ interface{} рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ interface{} рдЖрдорддреМрд░ рдкрд░ рдвреЗрд░ рдЖрд╡рдВрдЯрди рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИред
  • рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЕрдВрддрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

     // main.go package main import ( "fmt" "strconv" ) func strconvFmt(a string, b int) string { return a + ":" + strconv.Itoa(b) } func fmtFmt(a string, b int) string { return fmt.Sprintf("%s:%d", a, b) } func main() {} 

     // main_test.go package main import ( "testing" ) var ( a = "boo" blah = 42 box = "" ) func BenchmarkStrconv(b *testing.B) { for i := 0; i < bN; i++ { box = strconvFmt(a, blah) } a = box } func BenchmarkFmt(b *testing.B) { for i := 0; i < bN; i++ { box = fmtFmt(a, blah) } a = box } 

    рдореИрдХрдмреБрдХ рдкреНрд░реЛ рдкрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ:

      strfmt тЖТ go test -bench =ред  -benchmem
     goos: рдбрд╛рд░реНрд╡рд┐рди
     goarch: amd64
     pkg: github.com/sjwhitworth/perfblog/strfmt
     BenchmarkStrconv-8 30,000,000 39.5 ns / op 32 B / op 1 allocs / op
     рдмреЗрдВрдЪрдорд╛рд░реНрдХрдПрдлрдПрдордЯреА -8 10,000,000 143 ns / op 72 B / op 3 allocs / op 

    рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдЯреНрд░реЗрдВрдХ рд╡рд┐рдХрд▓реНрдк 3.5 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИ, рддреАрди рдмрд╛рд░ рдХрдо рдЖрд╡рдВрдЯрди рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдФрд░ рдЖрдзреА рдореЗрдореЛрд░реА рд▓реЗрддрд╛ рд╣реИред

    рдкреБрдирд░реНрд╡рд┐рддрд░рдг рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд▓рд╛рдЗрд╕ рдЯреИрдВрдХ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВ


    рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рд╕реНрдореГрддрд┐ рдореЗрдВ рдХрдЯрд╛ рд╣реБрдЖ рдЬрд╛рдирдХрд╛рд░реА рдЬрд▓реНрджреА рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред рдЧреЛ рдореЗрдВ рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд┐рд░реНрдорд╛рдг рд╣реИред рдпрд╣ рдПрдХ рд╕реНрдХреЗрд▓реЗрдмрд▓ рд╕рд░рдгреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдзрд╛рд░ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╣реА рдЖрдзрд╛рд░ рдореЗрдореЛрд░реА рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рддреАрди рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ:

     type slice struct { // pointer to underlying data in the slice. data uintptr // the number of elements in the slice. len int // the number of elements that the slice can // grow to before a new underlying array // is allocated. cap int } 

    рдпреЗ рдЦреЗрдд рдХреНрдпрд╛ рд╣реИрдВ?

    • data : рд╕реВрдЪрдХ рдХреЛ рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП
    • len : рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╡рд░реНрддрдорд╛рди рд╕рдВрдЦреНрдпрд╛
    • cap : рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкреБрдирд░реНрд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрдврд╝ рд╕рдХрддрд╛ рд╣реИ

    рд╣реБрдб рдХреЗ рддрд╣рдд рдзрд╛рд░рд╛рдПрдВ рддрдп рд▓рдВрдмрд╛рдИ рдХреА рд╕рд░рдгрд┐рдпрд╛рдБ рд╣реИрдВред рдЬрдм рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп ( cap ) рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдбрдмрд▓ рдорд╛рди рд╡рд╛рд▓рд╛ рдПрдХ рдирдпрд╛ рд╕рд░рдгреА рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореЗрдореЛрд░реА рдХреЛ рдкреБрд░рд╛рдиреЗ рд╕реНрд▓рд╛рдЗрд╕ рд╕реЗ рдирдП рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкреБрд░рд╛рдиреЗ рдПрд░реЗ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

    рдореБрдЭреЗ рдЕрдХреНрд╕рд░ рдЗрд╕ рдХреЛрдб рдХреА рддрд░рд╣ рдХреБрдЫ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рд╢реВрдиреНрдп рд╕реАрдорд╛ рдХреНрд╖рдорддрд╛ рд╡рд╛рд▓рд╛ рд╕реНрд▓рд╛рдЗрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╕реНрд▓рд╛рдЗрд╕ рдХреНрд╖рдорддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдЬреНрдЮрд╛рдд рд╣реИ:

     var userIDs []string for _, bar := range rsp.Users { userIDs = append(userIDs, bar.ID) } 

    рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрд▓рд╛рдЗрд╕ рд╢реВрдиреНрдп рдЖрдХрд╛рд░ len рдФрд░ рд╢реВрдиреНрдп рд╕реАрдорд╛ рдХреНрд╖рдорддрд╛ cap рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрд▓рд╛рдЗрд╕ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЙрд╕реА рд╕рдордп рд╣рдо рд╕реАрдорд╛ рдХреНрд╖рдорддрд╛ рддрдХ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ: рдПрдХ рдирдпрд╛ рдЖрдзрд╛рд░ рд╕рд░рдгреА рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ cap рджреЛрдЧреБрдирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдбреЗрдЯрд╛ рдЗрд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдореЗрдВ рдЙрддреНрддрд░ рдореЗрдВ 8 рддрддреНрд╡ рдорд┐рд▓рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рд╕реЗ 5 рдкреБрдирд░реНрд╡рд┐рддрд░рдг рд╣реЛрддреЗ рд╣реИрдВред

    рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реИ:

     userIDs := make([]string, 0, len(rsp.Users)) for _, bar := range rsp.Users { userIDs = append(userIDs, bar.ID) } 

    рдпрд╣рд╛рдВ рд╣рдордиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорддрд╛ рдЖрд╡рдВрдЯрд┐рдд рдХреА рд╣реИред рдЕрдм рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрдирд░реНрд╡рд┐рддрд░рдг рдФрд░ рдирдХрд▓ рдХреЗ рдмрд┐рдирд╛, рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╣рд╛рдВ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

    рдпрджрд┐ рдЖрдкрдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рддрдиреА рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреНрд╖рдорддрд╛ рдбрд╛рдпрдирд╛рдорд┐рдХ рд╣реИ рдпрд╛ рдмрд╛рдж рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрд▓рд╛рдЗрд╕ рд╕рд╛рдЗрдЬрд╝ рдХреЗ рдЕрдВрддрд┐рдо рд╡рд┐рддрд░рдг рдХреЛ рдорд╛рдкреЗрдВред рдореИрдВ рдЖрдорддреМрд░ рдкрд░ 90 рд╡рд╛рдБ рдпрд╛ 99 рд╡рд╛рдБ рдкреНрд░рддрд┐рд╢рдд рдФрд░ рд╣рд╛рд░реНрдб рдХреЛрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдорд╛рди рд▓реЗрддрд╛ рд╣реВрдБред рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рд╕реАрдкреАрдпреВ рдЖрдкрдХреЗ рд▓рд┐рдП рд░реИрдо рд╕реЗ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рд╣реИ, рдпрд╣ рдорд╛рди рдЬрд┐рддрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╕реЗрдЯ рдХрд░реЗрдВред

    рдЯрд┐рдк рдирдХреНрд╢реЛрдВ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ: make(map[string]string, len(foo)) рдкреБрдирд░реНрд╡рд┐рддрд░рдг рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдЧрд╛ред

    рдпрд╣ рд▓реЗрдЦ рджреЗрдЦреЗрдВ рдХрд┐ рд╕реНрд▓рд╛рдЗрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

    рдмрд╛рдЗрдЯ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


    рдкреИрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЙрди рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рдмрд╛рдЗрдЯ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдкреНрд░рд╕рд╛рд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ: рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЖрдорддреМрд░ рдкрд░ рд╡рд┐рддрд░рдг рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рджреЗрддреА рд╣реИрдВред

    рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╕рдордп рдХреА рддреБрд▓рдирд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╕рдордп рдФрд░ рд╕рдордп ред рдкрд╣рд▓реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЗрддрд╛ рд╣реИред рд╣реБрдб рдХреЗ рддрд╣рдд, рдпрд╣ рдПрдХ рдирдпрд╛ рдмрд╛рдЗрдЯ рд╕реНрд▓рд╛рдЗрд╕ рдЪреБрдирддрд╛ рд╣реИ рдФрд░ time.AppendFormat рдкрд░ time.AppendFormat рдХрд╣рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рдПрдХ рдмрд╛рдЗрдЯ рдмрдлрд░ рд▓реЗрддрд╛ рд╣реИ, рдПрдХ рд╕реНрд╡рд░реВрдкрд┐рдд рд╕рдордп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдмрд╛рдЗрдЯ рд╕реНрд▓рд╛рдЗрд╕ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЕрдХреНрд╕рд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: strconv.AppendFloat рдпрд╛ рдмрд╛рдЗрдЯреНрд╕ рджреЗрдЦреЗрдВ редNewBuffer ред

    рдЗрд╕рд╕реЗ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХреНрдпреЛрдВ рдмрдврд╝рддреА рд╣реИ? рдЦреИрд░, рдЕрдм рдЖрдк рдЙрд╕ рдмрд╛рдЗрдЯ рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ sync.Pool рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рдерд╛ред рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдПрдХ рдирдпрд╛ рдмрдлрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдпред рдпрд╛ рдЖрдк рд╕реНрд▓рд╛рдЗрд╕ рдХреА рджреЛрд╣рд░рд╛рдИ рдЧрдИ рдкреНрд░рддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрдлрд░ рдЖрдХрд╛рд░ рдХреЛ рдПрдХ рдореВрд▓реНрдп рдкрд░ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИред

    рд╕рд╛рд░рд╛рдВрд╢


    рдЖрдк рдЗрди рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдЖрдзрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдордп рдХреЗ рд╕рд╛рде, рдЖрдк рдЧреЛ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред рдЗрд╕рд╕реЗ рдЙрдирдХреЗ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдХрд╛рдлреА рдорджрдж рдорд┐рд▓реЗрдЧреАред

    рд▓реЗрдХрд┐рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпреЗ рд╕рд▓рд╛рд╣ рд╣реИрдВ, рд╕реБрд╕рдорд╛рдЪрд╛рд░ рдирд╣реАрдВред рдорд╛рдк рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдЬрд╛рдВрдЪреЗрдВред

    рдФрд░ рдкрддрд╛ рд╣реИ рдХрдм рд░реБрдХрдирд╛ рд╣реИред рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡реНрдпрд╛рдпрд╛рдо рд╣реИ: рдХрд╛рд░реНрдп рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рддреБрд░рдВрдд рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрддреНрдкрд╛рджрдХрддрд╛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реНрдерд┐рддрд┐ рдкрд░ рдЕрддреНрдпрдзрд┐рдХ рдирд┐рд░реНрднрд░ рд╣реИред рдпрджрд┐ рдЖрдкрдХреА рд╕реЗрд╡рд╛ 10 ms рдореЗрдВ рдЙрддреНрддрд░ рджреЗрддреА рд╣реИ, рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рд╡рд┐рд▓рдВрдм 90 ms рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдЗрди 10 ms рдХреЛ 5 ms рддрдХ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА 95 ms рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк 1 рдПрдордПрд╕ рддрдХ рд╕реЗрд╡рд╛ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднреА рдХреБрд▓ рджреЗрд░реА 91 рдПрдордПрд╕ рд╣реЛрдЧреАред рд╢рд╛рдпрдж рдмрдбрд╝реА рдордЫрд▓реА рдЦрд╛рддреЗ рд╣реИрдВред

    рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╕реЗ рдЕрдиреБрдХреВрд▓рди!

    рд╕рдВрджрд░реНрдн


    рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдкреНрд░реЗрд░рдгрд╛ рдХреЗ рдорд╣рд╛рди рд╕реНрд░реЛрдд рд╣реИрдВ:

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


All Articles