gpt4 book ai didi

go - 这在 Go 中会更有效吗?

转载 作者:IT老高 更新时间:2023-10-28 13:07:02 26 4
gpt4 key购买 nike

我写了一段代码来说明Go中的标准命令grep,但是速度是远远落后,有人可以给我任何进展吗?这是代码:

package main

import (
"bufio"
"fmt"
"log"
"os"
"strings"
"sync"
)

func parse_args() (file, pat string) {
if len(os.Args) < 3 {
log.Fatal("usage: gorep2 <file_name> <pattern>")
}

file = os.Args[1]
pat = os.Args[2]
return
}

func readFile(file string, to chan<- string) {
f, err := os.Open(file)
if err != nil {
log.Fatal(err)
}
defer f.Close()

freader := bufio.NewReader(f)
for {
line, er := freader.ReadBytes('\n')
if er == nil {
to <- string(line)
} else {
break
}

}
close(to)
}

func grepLine(pat string, from <-chan string, result chan<- bool) {
var wg sync.WaitGroup

for line := range from {
wg.Add(1)

go func(l string) {
defer wg.Done()
if strings.Contains(l, pat) {
result <- true
}
}(string(line))
}

wg.Wait()
close(result)
}

func main() {
file, pat := parse_args()
text_chan := make(chan string, 10)
result_chan := make(chan bool, 10)

go readFile(file, text_chan)
go grepLine(pat, text_chan, result_chan)

var total uint = 0
for r := range result_chan {
if r == true {
total += 1
}
}

fmt.Printf("Total %d\n", total)
}

Go 中的时间:

>>> time gogrep /var/log/task.log DEBUG 

Total 21089

real 0m0.156s
user 0m0.156s
sys 0m0.015s

grep中的时间:

>>> time grep DEBUG /var/log/task.log | wc -l

21089

real 0m0.069s
user 0m0.046s
sys 0m0.064s

最佳答案

为了一个易于重现的基准,我计算了莎士比亚中“和”文本的出现次数。

gogrep:$ go build gogrep.go && time ./gogrep /home/peter/shakespeare.txt and Total 21851real    0m0.613suser    0m0.651ssys 0m0.068sgrep:$ time grep and /home/peter/shakespeare.txt | wc -l21851real    0m0.108suser    0m0.107ssys 0m0.014spetergrep:$ go build petergrep.go && time ./petergrep /home/peter/shakespeare.txt and Total 21851real    0m0.098suser    0m0.092ssys 0m0.008s

petergrep is written in Go. It's fast.

package main

import (
"bufio"
"bytes"
"fmt"
"log"
"os"
)

func parse_args() (file, pat string) {
if len(os.Args) < 3 {
log.Fatal("usage: petergrep <file_name> <pattern>")
}
file = os.Args[1]
pat = os.Args[2]
return
}

func grepFile(file string, pat []byte) int64 {
patCount := int64(0)
f, err := os.Open(file)
if err != nil {
log.Fatal(err)
}
defer f.Close()
scanner := bufio.NewScanner(f)
for scanner.Scan() {
if bytes.Contains(scanner.Bytes(), pat) {
patCount++
}
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, err)
}
return patCount
}

func main() {
file, pat := parse_args()
total := grepFile(file, []byte(pat))
fmt.Printf("Total %d\n", total)
}

数据:Shakespeare: pg100.txt

关于go - 这在 Go 中会更有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26709971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com