gpt4 book ai didi

go - bufio.Reader 和 bufio.Scanner 的功能和性能

转载 作者:IT王子 更新时间:2023-10-29 01:01:28 27 4
gpt4 key购买 nike

我在互联网上看到过几条宣传语,它们松散地谈论了为什么应该使用 bufio.Scanner 而不是 bufio.Reader。

我不知道我的测试用例是否相关,但我决定在从文本文件中读取 1,000,000 行时进行对比测试:

package main

import (
"fmt"
"strconv"
"bufio"
"time"
"os"
//"bytes"
)

func main() {

fileName := "testfile.txt"

// Create 1,000,000 integers as strings
numItems := 1000000
startInitStringArray := time.Now()

var input [1000000]string
//var input []string

for i:=0; i < numItems; i++ {
input[i] = strconv.Itoa(i)
//input = append(input,strconv.Itoa(i))
}

elapsedInitStringArray := time.Since(startInitStringArray)
fmt.Printf("Took %s to populate string array.\n", elapsedInitStringArray)

// Write to a file
fo, _ := os.Create(fileName)
for i:=0; i < numItems; i++ {
fo.WriteString(input[i] + "\n")
}

fo.Close()

// Use reader
openedFile, _ := os.Open(fileName)

startReader := time.Now()
reader := bufio.NewReader(openedFile)

for i:=0; i < numItems; i++ {
reader.ReadLine()
}
elapsedReader := time.Since(startReader)
fmt.Printf("Took %s to read file using reader.\n", elapsedReader)
openedFile.Close()

// Use scanner
openedFile, _ = os.Open(fileName)

startScanner := time.Now()
scanner := bufio.NewScanner(openedFile)

for i:=0; i < numItems; i++ {
scanner.Scan()
scanner.Text()
}

elapsedScanner := time.Since(startScanner)
fmt.Printf("Took %s to read file using scanner.\n", elapsedScanner)
openedFile.Close()
}

我在时间上收到的相当平均的输出如下所示:

Took 44.1165ms to populate string array.
Took 17.0465ms to read file using reader.
Took 23.0613ms to read file using scanner.

我很好奇,什么时候使用阅读器和扫描仪更好,是基于性能还是基于功能?

最佳答案

这是一个有缺陷的基准。他们做的不是同一件事。

func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)

返回[]byte

func (s *Scanner) Text() string

返回 string([]byte)

为了比较,使用,

func (s *Scanner) Bytes() []byte

这是一个有缺陷的基准。它读取短字符串,从“0\n”到“999999\n”的整数。什么样的真实世界数据集是这样的?

在现实世界中,我们阅读莎士比亚:http://www.gutenberg.org/ebooks/100 : 纯文本 UTF-8: pg100.txt.

Took 2.973307ms to read file using reader.   size: 5340315 lines: 124787
Took 2.940388ms to read file using scanner. size: 5340315 lines: 124787

关于go - bufio.Reader 和 bufio.Scanner 的功能和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47442555/

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