猿问

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

我正在学习 Go 编程语言。请考虑以下程序,


package main


import (

    "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.WaitGroup


func 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 同时运行。但它几乎在相等的时间内执行。我想知道为什么会发生这种情况?


缥缈止盈
浏览 181回答 2
2回答

墨色风雨

尝试使用更多内核。此外,为了比较目的,使用更好的根目录,如 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: 1real    0m10.137suser    0m2.628ssys     0m6.472sGOMAXPROCS: 4real    0m3.284suser    0m2.492ssys     0m5.116s

千万里不及你

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

相关分类

Go
我要回答