рдЧреЛ рдореЗрдВ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ

рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдИ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рд╕реА рдореЗрдВ рдПрдХ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдореВрд▓ рдмреЛрд▓реА рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдЗрд╕ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддрд┐рдЧрдорди рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдерд╛ред рд▓реЗрдХрд┐рди рдЕрдм, рдЗрд╕ рдореВрд▓ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдордиреЗ рдПрдХ рдкреВрд░реНрдг рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

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

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

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдореЗрдХрдлрд╛рдЗрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ GNU рдореЗрдХ рдореЗрдВ -j рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


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

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдПрди рдереНрд░реЗрдб рдХреЛ рд╡реНрдпрд╕реНрдд рд░рдЦреЗрдВрдЧреЗ, рдЗрд╖реНрдЯрддрдо рдкреНрд░реЛрд╕реЗрд╕рд░ рдЙрдкрдпреЛрдЧ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдкрд░ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд┐рдП рдмрд┐рдирд╛ рдФрд░ рдереНрд░реЗрдб рдХреЗ рдирд┐рд░рдВрддрд░ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рд┐рдирд╛рд╢ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ C ++ рдФрд░ pthreads рдореЗрдВ рд╕рдм рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕, рдореНрдпреВрдЯреЗрдХреНрд╕, рд╕реЗрдорд╛рдлреЛрд░ рдФрд░ рд╕рд╢рд░реНрдд рдЪрд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдиреГрддреНрдп рдХреЗ рдХрдИ рдШрдВрдЯреЛрдВ рдХреЗ рдмрд╛рдж, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдФрд░ рдлрд┐рд░ рдореБрдЭреЗ рдЧреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рдЖрдпрд╛ред рдЗрд╕ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рди рдХрд░реЗрдВ - рдПрдХ рдШрдВрдЯреЗ рдХреЗ рдХрд╛рдо рдХреЗ рдмрд╛рдж, рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рддреИрдпрд╛рд░ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдЯреАрдПрдЖрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ, рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдФрд░ рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдЬреИрд╕реА рдЫреЛрдЯреА рдЪреАрдЬреЗрдВ рд╢рд╛рдорд┐рд▓ рдереАрдВред

рддреЛ: рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо TAR рдХреЛ рд╕реВрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕реЗ рдЕрдирдкреИрдХ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рд╕рдВрдХрд▓рдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреА рд╣реИред

рдореБрдЭреЗ рддреБрд░рдВрдд рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рдЬреЛ рдХреБрдЫ рднреА рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕рдХрд╛ рд▓рдХреНрд╖реНрдп (рдФрд░ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ) рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдЧреЛ рдкрд░ рдмрд╣реБ-рдкрд┐рд░реЛрдпрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдирд╛ рдХрд┐рддрдирд╛ рд╕рд░рд▓ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рд╕рд┐рд░реНрдл рд╕реНрд░реЛрдд рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдЬрдЧрд╣ рд╡рд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди "рд╕рдВрдХрд▓рди ()" рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрджрд▓рд╛рд╡ рдХреЗ рдХрдИ рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдХреИрд╕реЗ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

package main import ( "archive/tar" "container/vector" "exec" "flag" "fmt" "io" "os" "strings" ) //  :     . var jobs *int = flag.Int("jobs", 0, "number of concurrent jobs") var compiler *string = flag.String("cc", "bcom", "compiler name") func main() { flag.Parse() os.Args = flag.Args() args := os.Args ar := args[0] r, err := os.Open(ar, os.O_RDONLY, 0666); if err != nil { fmt.Printf("unable to open TAR %s\n", ar) os.Exit(1) } // defer -   "finally {}",   //     . defer r.Close() //   TAR. fmt.Printf("- extracting %s\n", ar) //    . tr := tar.NewReader( r ) tests := new(vector.StringVector) //    ,     //   . for { //      . hdr, _ := tr.Next() if hdr == nil { break } name := &hdr.Name //     ,  . if !strings.HasPrefix(*name, "HDR_") { tests.Push(*name) } //   . w, err := os.Open("data/" + *name, os.O_CREAT | os.O_RDWR, 0666) if err != nil { fmt.Printf("unable to create %s\n", *name) os.Exit(1) } //     . io.Copy(w, tr) w.Close() } fmt.Printf("- compiling...\n") *compiler , _ = exec.LookPath(*compiler) fmt.Printf("- compiler %s\n", *compiler) if *jobs == 0 { //  "compile()" ,   . fmt.Printf("- running sequentially\n") for i := 0; i < tests.Len(); i++ { compile(tests.At(i)) } } else { //  "compile()"   . fmt.Printf("- running %d concurrent job(s)\n", *jobs) //  :        , //   . -runner'   //    .     // .   ,    // ,   runner' . tasks := make(chan string, *jobs) //     -runner'. //    ,   runner'  //   .     . done := make(chan bool) //  runner'. for i := 0; i < *jobs; i++ { go runner(tasks, done) } //       .  //    ,   //  . for i := 0; i < tests.Len(); i++ { tasks <- tests.At(i) } //        //       . for i := 0; i < *jobs; i++ { tasks <- "" <- done } } } // -runner. func runner(tasks chan string, done chan bool) { //  . for { //    . ,   //   . name := <- tasks //   ,   . if len(name) == 0 { break } //  . compile(name) } //  ,   . done <- true } func compile(name string) { //  . c, err := exec.Run(*compiler, []string{*compiler, name}, os.Environ(), "./data", exec.DevNull, exec.PassThrough, exec.PassThrough) if err != nil { fmt.Printf("unable to compile %s (%s)\n", name, err.String()) os.Exit(1) } c.Wait(0) } 

makefile:

 target = tar_extractor all: 6g $(target).go 6l -o $(target) $(target).6 

рдореИрдВрдиреЗ рдЖрда рдкреНрд░реЛрд╕реЗрд╕рд░ рдмреНрд▓реЗрдб рдкрд░ рд▓рд┐рдирдХреНрд╕ 64-рдмрд┐рдЯ рдХреЗ рддрд╣рдд рдЗрд╕ рд╕рд╛рдорд╛рди рдХреЛ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ред рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рдореИрдВ рдорд╢реАрди рдкрд░ рдЕрдХреЗрд▓рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд░рдиреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред "рд╡рд┐рд╢рд╛рд▓.tar" рдлрд╝рд╛рдЗрд▓ рдореЗрдВ ~ 15 рд╣рдЬрд╛рд░ рд╕реНрд░реЛрдд рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИред

рдЬрдм рдорд╢реАрди рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рддреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓реЛрдбрд┐рдВрдЧ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ (рд╕рднреА рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓рдЧрднрдЧ 100% рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реИрдВ):

  Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 : 0.0%us, 0.0%sy, 0.0%ni, 99.7%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st Cpu2 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu3 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu4 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu5 : 0.0%us, 0.3%sy, 0.0%ni, 99.3%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st Cpu6 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu7 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 

рдЕрдиреБрдХреНрд░рдорд┐рдХ рдореЛрдб рдореЗрдВ рдЪрд▓рд╛рдПрдВ (-рдУрдЬрд╝рд░ 0):

  make && time -p ./tar_extractor -jobs 0 huge.tar 

рдХрд╛рдо рдХрд╛ рд╕рдордп:

  real 213.81 user 187.32 sys 61.33 

рд╕рднреА рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рд▓рдЧрднрдЧ 70-80% рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдореИрдВрдиреЗ рд╕рдВрдХрд▓рди рдЪрд░рдг рдХреЗ рджреМрд░рд╛рди рд╕рднреА рддрд╕реНрд╡реАрд░реЗрдВ рд▓реАрдВ):

  Cpu0 : 11.9%us, 4.3%sy, 0.0%ni, 82.5%id, 1.3%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 : 9.6%us, 2.7%sy, 0.0%ni, 87.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu2 : 4.3%us, 1.3%sy, 0.0%ni, 92.7%id, 1.7%wa, 0.0%hi, 0.0%si, 0.0%st Cpu3 : 16.0%us, 6.0%sy, 0.0%ni, 78.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu4 : 12.6%us, 4.3%sy, 0.0%ni, 82.7%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st Cpu5 : 11.6%us, 3.3%sy, 0.0%ni, 85.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu6 : 4.7%us, 1.3%sy, 0.0%ni, 94.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu7 : 16.6%us, 6.3%sy, 0.0%ni, 77.1%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 

рдХреБрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓реЛрдб 2.7% рд╣реИ:

  PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 15054 tester 18 0 41420 4980 1068 S 2.7 0.1 0:02.96 tar_extractor 

рдЕрдм рдереНрд░реЗрдб рдкреВрд▓ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рдЪреИрдирд▓ (-рдореБрдЦрдореИрдереБрди 1) рдХреЗ рд╕рд╛рдеред

рд╕рдордп:

  real 217.87 user 191.42 sys 62.53 

рдкреНрд░реЛрд╕реЗрд╕рд░:

  Cpu0 : 5.7%us, 1.7%sy, 0.0%ni, 92.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 : 13.3%us, 5.3%sy, 0.0%ni, 81.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu2 : 7.0%us, 2.7%sy, 0.0%ni, 89.3%id, 0.7%wa, 0.0%hi, 0.3%si, 0.0%st Cpu3 : 15.3%us, 5.7%sy, 0.0%ni, 77.7%id, 1.3%wa, 0.0%hi, 0.0%si, 0.0%st Cpu4 : 6.0%us, 2.0%sy, 0.0%ni, 92.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu5 : 14.3%us, 7.3%sy, 0.0%ni, 78.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu6 : 7.0%us, 2.3%sy, 0.0%ni, 90.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu7 : 15.3%us, 6.6%sy, 0.0%ni, 78.1%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рддрд╕реНрд╡реАрд░ рд╡рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдо рдПрдХ рдзрд╛рд░рд╛ рднреА рдЪрд▓рд╛рддреЗ рд╣реИрдВред

рдЕрдм рдереНрд░реЗрдб рдкреВрд▓ рдЪрд╛рд▓реВ рдХрд░реЗрдВ (-рдЬреЙрдм 32):

  make && time -p ./tar_extractor -jobs 32 huge.tar 

рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рдордп рд▓рдЧрднрдЧ рд╕рд╛рдд рдЧреБрдирд╛ рдЧрд┐рд░ рдЧрдпрд╛ рд╣реИ:

  real 38.38 user 195.55 sys 69.92 

рдХреБрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓реЛрдб (рд╕рдВрдХрд▓рди рдЪрд░рдг рдХреЗ рджреМрд░рд╛рди) рдмрдврд╝рдХрд░ 23% рд╣реЛ рдЧрдпрд╛:

  PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 17488 tester 16 0 45900 9732 1076 S 23.6 0.1 0:06.40 tar_extractor 

рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╕реНрдд рд╣реИрдВ:

  Cpu0 : 56.3%us, 26.3%sy, 0.0%ni, 17.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 : 55.5%us, 27.9%sy, 0.0%ni, 15.6%id, 1.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu2 : 56.1%us, 25.9%sy, 0.0%ni, 15.0%id, 0.7%wa, 0.3%hi, 2.0%si, 0.0%st Cpu3 : 58.1%us, 26.2%sy, 0.0%ni, 15.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu4 : 57.2%us, 25.8%sy, 0.0%ni, 17.1%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu5 : 56.8%us, 26.2%sy, 0.0%ni, 16.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu6 : 59.0%us, 26.3%sy, 0.0%ni, 13.0%id, 1.7%wa, 0.0%hi, 0.0%si, 0.0%st Cpu7 : 56.5%us, 27.2%sy, 0.0%ni, 16.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 

рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдорд╛рдирд╛рдВрддрд░ рдХреЛрдб рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдЧрддрд┐ рджреЗрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдк рдЧреЛ рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЛ рдХреИрд╕реЗ рд╕рд░рд▓ рдФрд░ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЧреЗ рдмрдврд╝реЛред рдЖрдЗрдП рджреЗрд╢реА рдзрд╛рдЧреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЧреЛ-рджрд┐рдирдЪрд░реНрдпрд╛ рдХреА рджрдХреНрд╖рддрд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реА ++ рдореЗрдВред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ, рдореИрдВ рдмреВрд╕реНрдЯ рдФрд░ рдирдП рд╕реА ++ рдореЗрдВ рд▓рдбрд╝рд╛рдХреВ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╕реА ++ рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд рд╣реА рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╣реИред

рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдЧрддрд┐ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд╛рдо рдХреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рджреЛрдиреЛрдВ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреНрд░рд╡рд╛рд╣ рдХреА рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдпрд╣ pthreads рдФрд░ рдЧреЛ-рд░реБрдЯреАрди рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмреАрдЪ рдПрдХ рд▓рдбрд╝рд╛рдИ рд╣реИ, рдЬреЛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдереНрд░реЗрдб рдирд╣реАрдВ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдХрд╣рддрд╛ рд╣реИ :

рдЧреЛрд░реВрдЯрд╛рдЗрди рдХреЛ рдХрдИ рдУрдПрд╕ рдереНрд░реЗрдбреНрд╕ рдкрд░ рдорд▓реНрдЯреАрдкреНрд▓реЗрдХреНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ I / O рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп, рдЕрдиреНрдп рд▓реЛрдЧ рдЪрд▓рддреЗ рд░рд╣рддреЗ рд╣реИрдВред рдЙрдирдХрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдзрд╛рдЧрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдкреНрд░рдмрдВрдзрди рдХреА рдХрдИ рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЕрдВрддрд┐рдо рдмрдврд╝рд╛рд╡рд╛ рд▓рд┐рдпрд╛, рдФрд░ рдЙрд╕реА рдЖрда рдкреНрд░реЛрд╕реЗрд╕рд░ рдорд╢реАрди рдкрд░ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ред

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

рддреЛ, рдЬрд╛рдУ рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо:

 package main import ( "flag" "fmt" ) var jobs *int = flag.Int("jobs", 8, "number of concurrent jobs") var n *int = flag.Int("tasks", 1000000, "number of tasks") func main() { flag.Parse() fmt.Printf("- running %d concurrent job(s)\n", *jobs) fmt.Printf("- running %d tasks\n", *n) tasks := make(chan int, *jobs) done := make(chan bool) for i := 0; i < *jobs; i++ { go runner(tasks, done) } for i := 1; i <= *n; i++ { tasks <- i } for i := 0; i < *jobs; i++ { tasks <- 0 <- done } } func runner(tasks chan int, done chan bool) { for { if arg := <- tasks; arg == 0 { break } worker() } done <- true } func worker() int { return 0 } 

Makefile рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП:

 target = go_threading all: build build: 6g $(target).go 6l -o $(target) $(target).6 run: (time -p ./$(target) -tasks=$(args) \ 1>/dev/null) 2>&1 | head -1 | awk '{ print $$2 }' n = \ 10000 \ 100000 \ 1000000 \ 10000000 \ 100000000 test: @for i in $(n); do \ echo "`printf '% 10d' $$i`" `$(MAKE) args=$$i run`; \ done 

C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо:

 #include <iostream> #include <boost/thread.hpp> #include <boost/bind.hpp> #include <queue> #include <string> #include <sstream> class thread_pool { typedef boost::function0<void> worker; boost::thread_group threads_; std::queue<worker> queue_; boost::mutex mutex_; boost::condition_variable cv_; bool done_; public: thread_pool() : done_(false) { for(int i = 0; i < boost::thread::hardware_concurrency(); ++i) threads_.create_thread(boost::bind(&thread_pool::run, this)); } void join() { threads_.join_all(); } void run() { while (true) { worker job; { boost::mutex::scoped_lock lock(mutex_); while (queue_.empty() && !done_) cv_.wait(lock); if (queue_.empty() && done_) return; job = queue_.front(); queue_.pop(); } execute(job); } } void execute(const worker& job) { job(); } void add(const worker& job) { boost::mutex::scoped_lock lock(mutex_); queue_.push(job); cv_.notify_one(); } void finish() { boost::mutex::scoped_lock lock(mutex_); done_ = true; cv_.notify_all(); } }; void task() { volatile int r = 0; } int main(int argc, char* argv[]) { thread_pool pool; int n = argc > 1 ? std::atoi(argv[1]) : 10000; int threads = boost::thread::hardware_concurrency(); std::cout << "- executing " << threads << " concurrent job(s)" << std::endl; std::cout << "- running " << n << " tasks" << std::endl; for (int i = 0; i < n; ++i) { pool.add(task); } pool.finish(); pool.join(); return 0; } 

makefile:

 BOOST = ~/opt/boost-1.46.1 target = boost_threading build: g++ -O2 -I $(BOOST) -o $(target) \ -lpthread \ -lboost_thread \ -L $(BOOST)/stage/lib \ $(target).cpp run: (time -p LD_LIBRARY_PATH=$(BOOST)/stage/lib ./$(target) $(args) \ 1>/dev/null) 2>&1 | head -1 | awk '{ print $$2 }' n = \ 10000 \ 100000 \ 1000000 \ 10000000 \ 100000000 test: @for i in $(n); do \ echo "`printf '% 10d' $$i`" `$(MAKE) args=$$i run`; \ done 

рджреЛрдиреЛрдВ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧреА - 8. рдЗрди рдЖрда рдереНрд░реЗрдбреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдЧреАред

C ++ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдПрдБ:

 make && make -s test g++ -O2 -I ~/opt/boost-1.46.1 -o boost_threading \ -lpthread \ -lboost_thread \ -L ~/opt/boost-1.46.1/stage/lib \ boost_threading.cpp (time -p LD_LIBRARY_PATH=~/opt/boost-1.46.1/stage/lib ./boost_threading \ 1>/dev/null) 2>&1 | head -1 | awk '{ print $2 }' 10000 0.03 100000 0.35 1000000 3.43 10000000 29.57 100000000 327.37 

рдЕрдм рдЬрд╛рдУ:

 make && make -s test 6g go_threading.go 6l -o go_threading go_threading.6 10000 0.00 100000 0.03 1000000 0.35 10000000 3.72 100000000 38.27 

рдЕрдВрддрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред

рд╡реИрд╕реЗ, рдпрджрд┐ рдЖрдк рд╕рднреА 8 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ рд░рдирдЯрд╛рдЗрдо рдХреЛ рдЪрд░ GOMAXPROCS = 8 рд╕реЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХреЗрд╡рд▓ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдИ рднреМрддрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИрдВ), рддреЛ рдЧреЛ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдЧрддрд┐ рдмреЗрддрд╣рд╛рд╢рд╛ рдЧрд┐рд░ рдЬрд╛рддреА рд╣реИ рдФрд░ C ++ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕рдордп рдХреЗ рд▓рдЧрднрдЧ рдмрд░рд╛рдмрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рд▓реНрдХреЗ рдереНрд░реЗрдбреНрд╕, рдореВрд▓ рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рд╢рд╛рдпрдж рдореИрдВ рд▓рд╛рд▓ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдирдордХреАрди рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗрд╡рд▓ рдЕрдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдВрдХреЗрдд рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рддреЛрддреЗ рд╣реИрдВред

рдЬрд╛рдиреЗ рдкрд░ рдкреЛрд╕реНрдЯ:

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


All Articles