为了账号安全,请及时绑定邮箱和手机立即绑定

为什么这个程序在使用 goroutines 时表现不佳?

为什么这个程序在使用 goroutines 时表现不佳?

Go
缥缈止盈 2021-06-20 09:06:38
我正在学习 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


查看完整回答
反对 回复 2021-06-21
?
千万里不及你

TA贡献1784条经验 获得超9个赞

您的程序的性能与磁盘(或 ram,如果 /tmp 是 ram 磁盘)的速度有关:计算受 I/O 限制。无论有多少 goroutine 并行运行,它的读取速度都不会比这更快。


查看完整回答
反对 回复 2021-06-21
  • 2 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信