рдЬрд╛рдУ: рдХреНрдпрд╛ рдореБрдЭреЗ рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЫрд╡рд┐
рд░реЗрдиреЗ рдлреНрд░реЗрдВрдЪ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдПрдХ рдореВрд▓ рдЧреЛрдлрд░ рд╕реЗ рдП рдЬрд░реНрдиреА рд╡рд┐рде рдЧреЛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдЪрд┐рддреНрд░рдгред

рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдХрдИ рдЧреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЙрдкрдпреЛрдЧ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд▓рдЧрддрд╛ рд╣реИред рд╕рдВрд░рдЪрдирд╛ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рджреЛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдЧрд╣рди рдбреЗрдЯрд╛ рд╡рд┐рддрд░рдг


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

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

рдирд┐рд╖реНрдХрд░реНрд╖


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

All Articles