当前位置:  开发笔记 > 编程语言 > 正文

写操作费用[Go lang]

如何解决《写操作费用[Golang]》经验,为你挑选了1个好方法。

我有一个Go程序,它将字符串写入文件.我有一个迭代20000次的循环,在每次迭代中我将大约20-30个字符串写入文件.我只是想知道哪个是将其写入文件的最佳方式.

方法1:在代码的开头保持打开文件指针,并为每个字符串写入.它使它成为20000*30的写操作.

方法2:使用bytes.Buffer Go并将所有内容存储在缓冲区中并在末尾写入.在这种情况下,文件指针应该从代码的开头或代码的末尾打开.有关系吗?

我假设方法2应该更好.有人可以用一个理由证实这一点.如何立即写作比定期写作更好.因为文件指针无论如何都会打开. 我使用f.WriteString()buffer.WriteString()缓冲区类型的bytes.Bufferf是文件指针打开.



1> kostya..:

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)
}

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有