BufReader 为什么能让读文件快几个数量级?默认缓冲多大?lines() 为什么比 read_line 慢?什么时候不需要它?这篇用 read 调用计数和 20 MB 文件的计时回答。
编译:成功
运行(退出码 0):
无缓冲 File + bytes():文件 100000 字节,逐字节读,底层 read 调用 100001 次(每个字节一次)
BufReader::new(默认容量 8192 字节) + bytes():读了同样 100000 字节,底层 read 调用 14 次
with_capacity( 64):底层 read 调用 1564 次(约 文件大小 / 容量 = 1562)
with_capacity( 1024):底层 read 调用 99 次(约 文件大小 / 容量 = 98)
with_capacity(65536):底层 read 调用 3 次(约 文件大小 / 容量 = 2)文件读写基础见std::fs 文件读写;写入侧见BufWriter 与批量写入。
编译:成功
运行(退出码 0):
文件 20000000 字节、1000000 行
read_to_string 一次读完再 lines(): 9.6 ms (行数 1000000)
BufReader::lines()(每行分配一个 String): 34.2 ms (行数 1000000)
BufReader + read_line 复用同一个 String: 19.3 ms (行数 1000000)
同上,缓冲区 1 MiB: 18.2 ms (行数 1000000)
无缓冲 File 逐字节读(只读前 20 万字节) 73.2 ms (只读了文件的 1.0%,按字节数折算整个文件约 7315 ms)文件在系统缓存中(不是冷读),耗时是本机 release 实测的最小值;无缓冲整文件耗时是按前 20 万字节折算的。
编译:成功
运行(退出码 0):
fill_buf(缓冲区容量 8)看到 "alpha\nbe"(8 字节),还没有消费
consume(3) 之后 buffer() = "ha\nbe"
read_until(\n) 得到 "ha\n"(包含分隔符)
lines() 的结果:["alpha", "beta", "gamma"](\n 与 \r\n 都被去掉,最后一行没有换行也算一行) 编译:成功
运行(退出码 0):
File::read_to_string 0.34 ms BufReader::read_to_string 0.32 ms(文件 4000000 字节)