рд░реЗрдиреЗ рдлреНрд░реЗрдВрдЪ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдПрдХ рдореВрд▓ рдЧреЛрдлрд░ рд╕реЗ рдП рдЬрд░реНрдиреА рд╡рд┐рде рдЧреЛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдЪрд┐рддреНрд░рдгредрдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдХрдИ рдЧреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЙрдкрдпреЛрдЧ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд▓рдЧрддрд╛ рд╣реИред рд╕рдВрд░рдЪрдирд╛ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджреЛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗредрдЧрд╣рди рдбреЗрдЯрд╛ рд╡рд┐рддрд░рдг
рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдЬрдм рдЖрдк рдЗрд╕рдХреЗ рдореВрд▓реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:type S struct {
a, b, c int64
d, e, f string
g, h, i float64
}
рдпрд╣рд╛рдВ рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдкрд╣реБрдВрдЪ рдХреЙрдкреА рдпрд╛ рдкреЙрдЗрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:func byCopy() S {
return S{
a: 1, b: 1, c: 1,
e: "foo", f: "foo",
g: 1.0, h: 1.0, i: 1.0,
}
}
func byPointer() *S {
return &S{
a: 1, b: 1, c: 1,
e: "foo", f: "foo",
g: 1.0, h: 1.0, i: 1.0,
}
}
рдЗрди рджреЛ рддрд░реАрдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо 2 рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рд╡рд╣ рд╕реНрдерд╛рди рд╣реИ рдЬрд╣рд╛рдБ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдПрдХ рдкреНрд░рддрд┐ рдХреЗ рд╕рд╛рде рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:func BenchmarkMemoryStack(b *testing.B) {
var s S
f, err := os.Create("stack.out")
if err != nil {
panic(err)
}
defer f.Close()
err = trace.Start(f)
if err != nil {
panic(err)
}
for i := 0; i < b.N; i++ {
s = byCopy()
}
trace.Stop()
b.StopTimer()
_ = fmt.Sprintf("%v", s.a)
}
рджреВрд╕рд░рд╛ - рдкрд╣рд▓реЗ рдХреЗ рд╕рдорд╛рди - рдЬрд╣рд╛рдВ рд╕рдВрд░рдЪрдирд╛ рд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ:func BenchmarkMemoryHeap(b *testing.B) {
var s *S
f, err := os.Create("heap.out")
if err != nil {
panic(err)
}
defer f.Close()
err = trace.Start(f)
if err != nil {
panic(err)
}
for i := 0; i < b.N; i++ {
s = byPointer()
}
trace.Stop()
b.StopTimer()
_ = fmt.Sprintf("%v", s.a)
}
рдЪрд▓реЛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЪрд▓рд╛рддреЗ рд╣реИрдВ:go test ./... -bench=BenchmarkMemoryHeap -benchmem -run=^$ -count=10 > head.txt && benchstat head.txt
go test ./... -bench=BenchmarkMemoryStack -benchmem -run=^$ -count=10 > stack.txt && benchstat stack.txt
рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдБрдХрдбрд╝реЗ рдорд┐рд▓рддреЗ рд╣реИрдВ:name time/op
MemoryHeap-4 75.0ns ┬▒ 5%
name alloc/op
MemoryHeap-4 96.0B ┬▒ 0%
name allocs/op
MemoryHeap-4 1.00 ┬▒ 0%
------------------
name time/op
MemoryStack-4 8.93ns ┬▒ 4%
name alloc/op
MemoryStack-4 0.00B
name allocs/op
MemoryStack-4 0.00
рдЗрд╕рдХреА рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ 8 рдЧреБрдирд╛ рддреЗрдЬ рдерд╛!рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐, рдЖрдЗрдП рдЯреНрд░реЗрд╕ рджреНрд╡рд╛рд░рд╛ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдЧреНрд░рд╛рдлрд╝ рдХреЛ рджреЗрдЦреЗрдВ: рдкреЙрдЗрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдлрд╝
рджреНрд╡рд╛рд░рд╛ рдХреЙрдкреА
рдХрд┐рдП рдЧрдП рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЗ рд▓рд┐рдПрдЧреНрд░рд╛рдлрд╝ рдкрд╣рд▓рд╛ рдЧреНрд░рд╛рдлрд╝ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЪреВрдВрдХрд┐ рдвреЗрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЛрдИ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧреЛрд░реВрдЯрд┐рди рдирд╣реАрдВ рд╣реИредрджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдвреЗрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдиреЗ рдФрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ ред рдпрджрд┐ рд╣рдо рдЧреНрд░рд╛рдл рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддрд╛ рд╣реИ:
рдпрд╣ рдЧреНрд░рд╛рдл рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдкреНрд░рддреНрдпреЗрдХ 4 рдПрдордПрд╕ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИредрдпрджрд┐ рд╣рдо рдлрд┐рд░ рд╕реЗ рдЬрд╝реВрдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:
рдиреАрд▓реА, рдЧреБрд▓рд╛рдмреА рдФрд░ рд▓рд╛рд▓ рдзрд╛рд░рд┐рдпрд╛рдБ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╛рд╣рдХ рдХреЗ рдЪрд░рдг рд╣реИрдВ, рдФрд░ рднреВрд░реЗ рд░рдВрдЧ рдвреЗрд░ рдореЗрдВ рдЖрд╡рдВрдЯрди рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВ (рдЧреНрд░рд╛рдл рдкрд░ "runtime.bgspepep" рдЪрд┐рд╣реНрдирд┐рдд):рд╕реНрд╡реАрдкрд┐рдВрдЧ рдбреЗрдЯрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдореЗрдореЛрд░реА рдХреЗ рдвреЗрд░ рд╕реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХреНрд░рд┐рдпрд╛ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рдЧреЙрдЙрдЯрд╛рдЗрдиреНрд╕ рдвреЗрд░ рд╕реНрдореГрддрд┐ рдореЗрдВ рдирдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рд╕реНрд╡реАрдкрд┐рдВрдЧ рджреЗрд░реА рдХреЛ рдвреЗрд░ рдореЗрдореЛрд░реА рдореЗрдВ рдЖрд╡рдВрдЯрди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдг рд╕реЗ рдЬреБрдбрд╝реЗ рдХрд┐рд╕реА рднреА рджреЗрд░реА рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
www.ardanlabs.com/blog/2018/12/garbage-collection-in-go-part1-semantics.html
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдереЛрдбрд╝рд╛ рдЪрд░рдо рдкрд░ рд╣реИ, рддреЛ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдвреЗрд░ рдХреЗ рдмрдЬрд╛рдп рдвреЗрд░ рдкрд░ рдПрдХ рдЪрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдорд╣рдВрдЧрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдвреЗрд░ рдкрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдвреЗрд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдкрддрд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИредрдпрджрд┐ рдЖрдк рд╕реНрдЯреИрдХ / рд╣реАрдк рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдк рдЙрдирдХреЗ рдЖрдВрддрд░рд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреЙрд▓ рдЧреНрд░рд┐рдмрдмрд▓ рдХрд╛ рдпрд╣ рд▓реЗрдЦ ред
рдЕрдЧрд░ рд╣рдо рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ GOMAXPROCS = 1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 1 рддрдХ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рд╛рд▓рд╛рдд рдФрд░ рднреА рдмреБрд░реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:name time/op
MemoryHeap 114ns ┬▒ 4%
name alloc/op
MemoryHeap 96.0B ┬▒ 0%
name allocs/op
MemoryHeap 1.00 ┬▒ 0%
------------------
name time/op
MemoryStack 8.77ns ┬▒ 5%
name alloc/op
MemoryStack 0.00B
name allocs/op
MemoryStack 0.00
рдпрджрд┐ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦрдиреЗ рдХреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реБрдЖ, рддреЛ рдвреЗрд░ рдкрд░ рд╕рдВрдХреЗрддрдХ 75ns / op рд╕реЗ рдШрдЯрдХрд░ 114ns / op рд╣реЛ рдЧрдпрд╛редрдЧрд╣рди рд╕рдорд╛рд░реЛрд╣ рдХреЙрд▓
рд╣рдо рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рджреЛ рдЦрд╛рд▓реА рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдФрд░ рдЕрдкрдиреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВрдЧреЗ:func (s S) stack(s1 S) {}
func (s *S) heap(s1 *S) {}
рд╕реНрдЯреИрдХ рдкрд░ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдПрдХ рдкреНрд░рддрд┐ рджреЗрдЧрд╛:func BenchmarkMemoryStack(b *testing.B) {
var s S
var s1 S
s = byCopy()
s1 = byCopy()
for i := 0; i < b.N; i++ {
for i := 0; i < 1000000; i++ {
s.stack(s1)
}
}
}
рдФрд░ рдвреЗрд░ рдХреЗ рд▓рд┐рдП рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкреЙрдЗрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛:func BenchmarkMemoryHeap(b *testing.B) {
var s *S
var s1 *S
s = byPointer()
s1 = byPointer()
for i := 0; i < b.N; i++ {
for i := 0; i < 1000000; i++ {
s.heap(s1)
}
}
}
рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ, рдкрд░рд┐рдгрд╛рдо рдЕрдм рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ:name time/op
MemoryHeap-4 301┬╡s ┬▒ 4%
name alloc/op
MemoryHeap-4 0.00B
name allocs/op
MemoryHeap-4 0.00
------------------
name time/op
MemoryStack-4 595┬╡s ┬▒ 2%
name alloc/op
MemoryStack-4 0.00B
name allocs/op
MemoryStack-4 0.00
рдирд┐рд╖реНрдХрд░реНрд╖
рдЧреЛ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╢рдмреНрджрд╛рд░реНрде рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдмрд┐рд▓ рдХреИрдиреЗрдбреА рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рдд рдореВрд▓реНрдп / рд╕реВрдЪрдХ рд╢рдмреНрджрд╛рд░реНрде рдкрд░ рдПрдХ рдкреЛрд╕реНрдЯ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ ред рдпрд╣ рдЖрдкрдХреЛ рдЙрди рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХрд╛ рдмреЗрд╣рддрд░ рд╡рд┐рдЪрд╛рд░ рджреЗрдЧрд╛ рдЬреЛ рдЖрдк рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрдкрдХреЗ рдЖрд╡рдВрдЯрди рдФрд░ рдвреЗрд░ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред