рдЬрд╛рдУ: рдмрд╣реБрдЖрдпрд╛рдореА

рдореБрдЭреЗ рдЧреЛ рдореЗрдВ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рд╡рд┐рд╖рдп рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдереА: habrahabr.ru/post/195574 ред
рдореИрдВрдиреЗ рд▓реЗрдЦрдХ рдФрд░ рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝рд╛ рдФрд░ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рд╡рд┐рд╖рдп рдХрд╛ рдЕрднреА рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦреБрд▓рд╛рд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЧрд▓рдд рди рд╕рдордЭрд╛ рдЬрд╛рдП, рдореИрдВ рдЖрдкрд╕реЗ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рдж "рдзрд╛рдЧрд╛" рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ "рдзрд╛рдЧрд╛" рдХреЗ рдЕрд░реНрде рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ "рдзрд╛рд░рд╛" рдХреЗ рдЕрд░реНрде рдореЗрдВред рдЖрдкрдХрд╛ рдзрдиреНрдпрд╡рд╛рдж

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

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкрд╛рда
/* channel_test01.go * Tests how go-routines interact with channels * Call: channel_test01 --help * Pls, do not use name "channel_test", because this name always is used by go-pkg-system */ package main import ( "fmt" "time" "flag" "os" "runtime" ) // flag support for program var MAXPROCS int var LOAD_CYCLES int //internal burden cycle var Usage = func() { fmt.Fprintf(os.Stderr, "Usage channel_test01 [-maxprocs=NN] [-cycles=NN] \n", os.Args[0]) } func init() { flag.IntVar(&MAXPROCS, "maxprocs", 1, "maxprocs for testing. From 1 to 256 "); flag.IntVar(&LOAD_CYCLES, "cycles", 1000, "burden internal cycle for testing. From 1 to 1000000 and more "); } func main() { flag.Parse();//get MAXPROCS and LOAD_CYCLES from flags // runtime.GOMAXPROCS() returns previous max_procs max_procs := runtime.GOMAXPROCS(MAXPROCS) // second call to get real state max_procs = runtime.GOMAXPROCS(MAXPROCS) fmt.Println("MaxProcs = ", max_procs) ch1 := make(chan int) ch2 := make(chan float64) go chan_filler(ch1, ch2) go chan_extractor(ch1, ch2) fmt.Println("Total:", <-ch2, <-ch2) } func chan_filler(ch1 chan int, ch2 chan float64) { const CHANNEL_SIZE = 1000000 for i := 0; i < CHANNEL_SIZE; i++ { for j := 0; j < LOAD_CYCLES; j++ { i++ } //thus we avoid optimizer influence i = i - LOAD_CYCLES ch1 <- i } ch1 <- -1 ch2 <- 0.0 } func chan_extractor(ch1 chan int, ch2 chan float64) { const PORTION_SIZE = 100000 total := 0.0 for { t1 := time.Now().UnixNano() for i := 0; i < PORTION_SIZE; i++ { // burden cycle for j := 0; j < LOAD_CYCLES; j++ { i++ } i = i - LOAD_CYCLES m := <-ch1 if m == -1 { ch2 <- total } } t2 := time.Now().UnixNano() dt := float64(t2 - t1)/1e9 //nanoseconds ==> seconds total += dt fmt.Println(dt) } } 



рдкрд░рд┐рдгрд╛рдо

рдорд╢реАрди: рдЗрдВрдЯреЗрд▓, 3 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдкрд░ 4 рдХреЛрд░, 4 рдЬреАрдмреА рд░реИрдо, рд▓рд┐рдирдХреНрд╕-x86-64, рдХрд░реНрдиреЗрд▓-3.11, рдЧреЛрд▓рдВрдЧ-1.1.2

рдореЗрд░реА рдорд╢реАрди рдкрд░ рдЕрдзрд┐рдХрддрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд░рдирдЯрд╛рдЗрдоред MAXPROCS рдорд╛рди 256 рд╣реИред рдЖрдк рдЕрдзрд┐рдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА 256 рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди 1 рд╣реИред

рдХрд╛рд░реНрдпрдХреНрд░рдо рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ (ps -C channel_test01 -L)
рдПрдЯрдореИрдХреНрд╕рдкреНрд░реЛрдХреНрд╕ = 1: 3 рдзрд╛рдЧреЗред
-рдореИрдХреНрд╕рдкреНрд░реЛрдХреНрд╕ рдХреЗ рд╕рд╛рде = 2 рдпрд╛ рдЕрдзрд┐рдХ: рд╣рдореЗрд╢рд╛ 4 рдзрд╛рдЧреЗред

рдХрднреА-рдХрднреА, рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди, 2 рдФрд░ рдкреНрд░рд╡рд╛рд╣ рджрд┐рдЦрд╛рдИ рджрд┐рдП, рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрдд рддрдХ рдмрдиреЗ рд░рд╣реЗред рдпрд╣ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

(рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рд╕рд░реНрд╡рд░ рдкрд░ рдЖрдЬрд╝рдорд╛рдпрд╛, рдЬрд┐рд╕рдореЗрдВ 24 рдХреЛрд░ / proc / cpuinfo рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рдЗрд╕ рдкрд░ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рднреА 4 рдереАред рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдПрдХ рдкрд╛рдБрдЪрд╡рд╛рдБ рдзрд╛рдЧрд╛ рд╣реЛрддрд╛ рдерд╛ - рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓рд╛рд▓рдЪреА vds рдХреЛ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЬрд▓реНрджреА рдирд╣реАрдВ рдереАред , рдФрд░ рдХреВрдбрд╝рд╛ рдЙрдард╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗ)ред

рдЪрдХреНрд░ = 1000 рдкрд░ рдкреНрд░рд╡рд╛рд╣ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдЪреИрдирд▓ рдХреА рднрд░рдиреЗ рдХреА рджрд░ рдХреА рдирд┐рд░реНрднрд░рддрд╛

perf-procs рдЧреНрд░рд╛рдл

рдЕрдзрд┐рдХрддрдо рдкреНрд░рджрд░реНрд╢рди MAXPROCS = 1 рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддрд╛ рд╣реИ

рдЧрд┐рдЯреНрдЯреА рд▓реЛрдб рдореЗрдВ рд╡реГрджреНрдзрд┐ рдкрд░ рдЪреИрдирд▓ рднрд░рдиреЗ рдХреА рджрд░ рдХреА рдирд┐рд░реНрднрд░рддрд╛


рдкрд░-рд▓реЛрдб рдЧреНрд░рд╛рдл

рд▓реЛрдб рдХреЗ рддрд╣рдд, рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдЕрднреА рднреА рдЕрдкрдирд╛ рдЯреЛрд▓ рд▓реЗрддрд╛ рд╣реИред

рдЪрд╛рд░реНрдЯ рд╕реЗ рдирд┐рд╖реНрдХрд░реНрд╖

рдореИрдХреНрд╕рдкреНрд░реЛрдХреНрд╕ = 1 рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ 1 рдереНрд░реЗрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЫрджреНрдо-рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдЖрдВрддрд░рд┐рдХ рдЧреЛрд▓рдВрдЧ рдЕрдиреБрд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрд╣реБрдд рдХреБрд╢рд▓ рд╣реИред
рдореИрдХреНрд╕рдкреНрд░реЛрдХреНрд╕ = 2 рдпрд╛ рдЕрдзрд┐рдХ рдХреЗ рд╕рд╛рде, рдЕрдзрд┐рдХ рдкреНрд░рд╡рд╛рд╣ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХрд╛ рддрдВрддреНрд░ рдЪрд╛рд▓реВ рд╣реЛрддрд╛ рд╣реИред рд░реБрдХрд╛рд╡рдЯреЗрдВ рдЖрддреА рд╣реИрдВ, рдФрд░ рд╕рдм рдХреБрдЫ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реЛрдиреЗ рдХреЗ рдзрд╛рдЧреЗ рдкрд░ - рд▓рдЧрднрдЧ 2 рдмрд╛рд░ред
рдореИрдХреНрд╕рдкреНрд░реЛрдХреНрд╕ = 3..256 рдХреЗ рд╕рд╛рде, рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рдмрдврд╝рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдереНрд░реЗрдбреНрд╕ "рдЫрджреНрдо-рдзрд╛рдЧреЗ" рдмрди рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдЖрдВрддрд░рд┐рдХ рдЧреЛрд▓рдВрдЧ рдЕрдиреБрд╕реВрдЪрдХ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдЖрдиреЗ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ "рдЫрджреНрдо-рд╕реВрддреНрд░" рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рдЧрддрд┐ рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд╡реГрджреНрдзрд┐ рджреЗрддрд╛ рд╣реИред
рдореИрдХреНрд╕рдкреНрд░реЛрдХреНрд╕ (256 рдХреЗ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рддрдХ) рдореЗрдВ рдФрд░ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде, рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдзрд╛рдЧреЗ рдЫрджреНрдо рдзрд╛рдЧреЗ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЖрдВрддрд░рд┐рдХ рдЕрдиреБрд╕реВрдЪрдХ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреБрдЫ рдзрд╛рдЧреЗ рдЕрднреА рднреА рд╕реНрд╡рддрдВрддреНрд░ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдзрд╛рдЧреЗ рд╣реИрдВред рд╕реНрд▓реАрдкрд┐рдВрдЧ рдереНрд░реЗрдбреНрд╕ рдФрд░ рдлрд╛рд╕реНрдЯ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдкрд░, рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рд▓рдЧрднрдЧ 10% рдЦрд░реНрдЪ рд╣реЛрддрд╛ рд╣реИред

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

рд░рдирдЯрд╛рдЗрдо рдмрджрд▓рдирд╛ред MAXPROCS рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд▓рд╛рдн рдФрд░ рд╣рд╛рдирд┐ рджреЛрдиреЛрдВ рд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╛рдирд╛рдВрддрд░рдХрд░рдг рдХрд╛ рдкреНрд░рднрд╛рд╡ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

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


All Articles