我有一个Go程序,它将字符串写入文件.我有一个迭代20000次的循环,在每次迭代中我将大约20-30个字符串写入文件.我只是想知道哪个是将其写入文件的最佳方式.
方法1:在代码的开头保持打开文件指针,并为每个字符串写入.它使它成为20000*30的写操作.
方法2:使用bytes.Buffer Go并将所有内容存储在缓冲区中并在末尾写入.在这种情况下,文件指针应该从代码的开头或代码的末尾打开.有关系吗?
我假设方法2应该更好.有人可以用一个理由证实这一点.如何立即写作比定期写作更好.因为文件指针无论如何都会打开.
我使用f.WriteString(
和buffer.WriteString(
缓冲区类型的bytes.Buffer
和f
是文件指针打开.
bufio包已经完全为这种任务创建.在进行系统调用之前,不要为每个Write调用进行系统调用,而是bufio.Writer
在内部存储器中缓冲多达固定数量的字节.在系统调用之后,内部缓冲区将重用于下一部分数据
与您的第二种方法相比 bufio.Writer
进行更多的系统调用(N/S
而不是1
)
使用更少的内存(S
字节而不是N
字节)
其中S
- 是缓冲区大小(可以通过指定bufio.NewWriterSize
),N
- 需要写入的数据的总大小.
用法示例(https://play.golang.org/p/AvBE1d6wpT):
f, err := os.Create("file.txt") if err != nil { log.Fatal(err) } defer f.Close() w := bufio.NewWriter(f) fmt.Fprint(w, "Hello, ") fmt.Fprint(w, "world!") err = w.Flush() // Don't forget to flush! if err != nil { log.Fatal(err) }