前 言
BUFIO 是什么?
BUFIO 是用来驱动 I/O 列内的专用时钟网络,这个专用的时钟网络独立于全局时钟资源,适合采集源同步数据。BUFIO 只能由位于同一时钟区域的 Clock-Capable I/O驱动。一个时钟区域有4个 BURIO,其中的2个可以驱动相邻区域的 I/O 时钟网络。BUFIO 不能驱动逻辑资源(CLB、BRAM等),因为 I/O 时钟网络只存在于 I/O 列中。
简单点就是:
bufio 包实现了带缓存的 I/O 操作
它封装一个 io.Reader 或 io.Writer 对象
使其具有缓存和一些文本读写功能
本文主要来对比一下 BUFIO 中的 ReadString 和 ReadLine 函数的性能。
注:测试代码忽略读取内容和错误处理
ReadString 函数
ReadString 代码:
func ReadString(filename string) {
f, _ := os.Open(filename)
defer f.Close()
r := bufio.NewReader(f)
for {
_, err := r.ReadString('\n')
if err != nil {
break
}
}
}
ReadLine 函数
ReadLine 代码:
func ReadLine(filename string) {
f, _ := os.Open(filename)
defer f.Close()
r := bufio.NewReader(f)
for {
_, err := readLine(r)
if err != nil {
break
}
}
}
此函数主要解决单行字节数大于4096的情况
func readLine(r *bufio.Reader) (string, error) {
line, isprefix, err := r.ReadLine()
for isprefix && err == nil {
var bs []byte
bs, isprefix, err = r.ReadLine()
line = append(line, bs...)
}
return string(line), err
}
注: 测试文件 log 每行字节数均大于4096
性 能 对 比
以上两种方式分别读取10G/20G/30G文件的耗时如下:
读取10G文件耗时
readstring:30.717832767s
readline:27.358268244s
读取20G文件耗时
readstring:59.937901346s
readline:54.871384854s
**读取30G文件耗时******
readstring:1m21.657831495s
readline:1m13.222376352s
结 论
ReadLine 读取文件更快,原因是由于 ReadString 后端调用 ReadBytes,而 ReadBytes 多次使用 copy 方法造成大量耗时。
测试代码如下:
package main
import (
"bufio"
"fmt"
"os"
"time"
)
func main() {
filename := "./log"
s := time.Now()
ReadString(filename)
e1 := time.Now()
fmt.Printf("readstring:%v\n", e1.Sub(s))
ReadLine(filename)
e2 := time.Now()
fmt.Printf("readline:%v\n", e2.Sub(e1))
}
func ReadString(filename string) {
f, _ := os.Open(filename)
defer f.Close()
r := bufio.NewReader(f)
for {
_, err := r.ReadString('\n') //忽略内容
if err != nil {
break
}
}
}
func ReadLine(filename string) {
f, _ := os.Open(filename)
defer f.Close()
r := bufio.NewReader(f)
for {
_, err := readLine(r)
if err != nil {
break
}
}
}
func readLine(r *bufio.Reader) (string, error) {
line, isprefix, err := r.ReadLine()
for isprefix && err == nil {
var bs []byte
bs, isprefix, err = r.ReadLine()
line = append(line, bs...)
}
return string(line), err
}
技术交流QQ群:368573673
有兴趣的可以关注我们的微信公众号:Reboot51
有疑问加站长微信联系(非本文作者)

受硬件影响较大,不说明配置确实难以比较
同时你把读取的东西忽略掉也是受影响的,10g东西30s是不可能的事情
这是我的测试,读取2g文件然后处理接着写入文件,一共花了36点几s,所以你的测试是不准确的,我的是固态硬盘,cpu差点,下面是代码:
下面同样的读取2g的同一个文件,我给出分段读取分段处理的代码,是我认为比较快的代码了,时间一般是13s左右,竞争大则需要花费26s左右,还可以优化的!采用异步读取和写入!望能抛砖引玉: