2 回答

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個贊
package main
import (
? ? "bufio"
? ? "bytes"
? ? "fmt"
? ? "os"
)
func main() {
? ? file, _ := os.Open("dic.dat")
? ? scanner := bufio.NewScanner(file)
? ? for scanner.Scan() {
? ? ? ? data := scanner.Bytes()
? ? ? ? if bytes.HasPrefix(data, []byte("(")) {
? ? ? ? ? ? continue
? ? ? ? }
? ? ? ? line := scanner.Text()
? ? ? ? fmt.Println(line)
? ? }
}
輸出:
acceptant|1
acceptation|3
accepted|6
accepting|1
按照設(shè)計(jì),Go 代碼應(yīng)該是高效的。Go 標(biāo)準(zhǔn)庫測試包包含一個基準(zhǔn)功能。
避免不必要的轉(zhuǎn)換和分配很重要。例如,將從文件中讀取的字節(jié)片轉(zhuǎn)換為字符串、分配和復(fù)制。
在這種情況下,我們只需要將接受的數(shù)據(jù)轉(zhuǎn)換為字符串即可。例如,更喜歡字節(jié)而不是文本。
$ go test dict_test.go -bench=.
BenchmarkText-4? ? ? 500? ? 2486306 ns/op? ? 898528 B/op? ? 14170 allocs/op
BenchmarkBytes-4? ? 1000? ? 1489828 ns/op? ? ?34080 B/op? ? ? 609 allocs/op
$
樣本基準(zhǔn)數(shù)據(jù):
KEY: Aback.
SYN: Backwards, rearwards, aft, abaft, astern, behind, back.
ANT: Onwards, forwards, ahead, before, afront, beyond, afore.
=
KEY: Abandon.
SYN: Leave, forsake, desert, renounce, cease, relinquish,
discontinue, castoff, resign, retire, quit, forego, forswear,
depart from, vacate, surrender, abjure, repudiate.
ANT: Pursue, prosecute, undertake, seek, court, cherish, favor,
protect, claim, maintain, defend, advocate, retain, support, uphold,
occupy, haunt, hold, assert, vindicate, keep.
=
dict_test.go:
package main
import (
? ? "bufio"
? ? "bytes"
? ? "fmt"
? ? "io/ioutil"
? ? "os"
? ? "strings"
? ? "testing"
)
func BenchmarkText(b *testing.B) {
? ? b.ReportAllocs()
? ? for N := 0; N < b.N; N++ {
? ? ? ? file := bytes.NewReader(benchData)
? ? ? ? scanner := bufio.NewScanner(file)
? ? ? ? for scanner.Scan() {
? ? ? ? ? ? line := scanner.Text()
? ? ? ? ? ? if !strings.HasPrefix(line, "KEY") {
? ? ? ? ? ? ? ? continue
? ? ? ? ? ? }
? ? ? ? ? ? _ = line // process line
? ? ? ? }
? ? ? ? if err := scanner.Err(); err != nil {
? ? ? ? ? ? b.Fatal(err)
? ? ? ? }
? ? }
}
func BenchmarkBytes(b *testing.B) {
? ? b.ReportAllocs()
? ? for N := 0; N < b.N; N++ {
? ? ? ? file := bytes.NewReader(benchData)
? ? ? ? scanner := bufio.NewScanner(file)
? ? ? ? for scanner.Scan() {
? ? ? ? ? ? data := scanner.Bytes()
? ? ? ? ? ? if !bytes.HasPrefix(data, []byte("KEY")) {
? ? ? ? ? ? ? ? continue
? ? ? ? ? ? }
? ? ? ? ? ? line := scanner.Text()
? ? ? ? ? ? _ = line // process line
? ? ? ? }
? ? ? ? if err := scanner.Err(); err != nil {
? ? ? ? ? ? b.Fatal(err)
? ? ? ? }
? ? }
}
var benchData = func() []byte {
? ? // A Complete Dictionary of Synonyms and Antonyms by Samuel Fallows
? ? // http://www.gutenberg.org/files/51155/51155-0.txt
? ? data, err := ioutil.ReadFile(`/home/peter/dictionary.51155-0.txt`)
? ? if err != nil {
? ? ? ? panic(err)
? ? }
? ? return data
}()

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個贊
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
file, _ := os.Open("dic.dat")
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
if strings.HasPrefix(line, "(") {
continue
}
fmt.Println(line)
}
}
- 2 回答
- 0 關(guān)注
- 173 瀏覽