5

我正在学习 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目录中的所有文件,并grep在 goroutine 中对每个文件执行 a。所以这将产生ngoroutines目录n中存在的文件数量/tmp。Main 等待所有 goroutine 完成工作。

有趣的是,这个程序在使用和不使用 goroutine 的情况下都需要相同的时间来执行。尝试运行go grep (path, c)grep (path, c)(执行此操作时您需要评论频道内容)。

我期待 goroutine 版本运行得更快,因为多个 grep 同时运行。但它几乎在相同的时间内执行。我想知道为什么会这样?

4

2 回答 2

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
于 2013-06-27T14:46:30.063 回答
4

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

于 2013-06-27T13:09:42.440 回答