我正在学习 Go 编程语言。请考虑以下程序,package mainimport ( "fmt" "bytes" "os" "os/exec" "path/filepath" "sync")func grep(file string) { defer wg.Done() cmd := exec.Command("grep", "-H", "--color=always", "add", file) var out bytes.Buffer cmd.Stdout = &out cmd.Run() fmt.Printf("%s\n", out.String())}func walkFn(path string, info os.FileInfo, err error) error { if !info.IsDir() { wg.Add(1) go grep (path) } return nil}var wg sync.WaitGroupfunc main() { filepath.Walk("/tmp/", walkFn) wg.Wait()}该程序遍历目录中的所有文件/tmp,并对grepgoroutine 中的每个文件执行 a。所以这将产生ngoroutines,其中n是目录中存在的文件数/tmp。Main 等待所有 goroutine 完成工作。有趣的是,该程序在使用和不使用 goroutine 的情况下执行所需的时间相同。尝试运行go grep (path, c)和grep (path, c)(这样做时您需要评论频道内容)。我期待 goroutine 版本运行得更快,因为多个 grep 同时运行。但它几乎在相等的时间内执行。我想知道为什么会发生这种情况?
2 回答
墨色风雨
TA贡献1853条经验 获得超6个赞
尝试使用更多内核。此外,为了比较目的,使用更好的根目录,如 Go 目录。SSD 也有很大的不同。例如,
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
goroot := "/home/peter/go/"
filepath.Walk(goroot, walkFn)
wg.Wait()
fmt.Println("GOMAXPROCS:", runtime.GOMAXPROCS(0))
}
GOMAXPROCS: 1
real 0m10.137s
user 0m2.628s
sys 0m6.472s
GOMAXPROCS: 4
real 0m3.284s
user 0m2.492s
sys 0m5.116s
- 2 回答
- 0 关注
- 171 浏览
添加回答
举报
0/150
提交
取消