2 回答
TA贡献1828条经验 获得超6个赞
根据 MuffinTop 的评论,这是提高速度的代码片段。性能损失与 Scanner 的使用无关,而是与以下事实有关:
不在输出中使用缓冲
使用
scanner.Text()-which 分配一个字符串 - 而不是scanner.Bytes()
添加输出缓冲的性能:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, _ := os.Open("test")
w := bufio.NewWriter(os.Stdout)
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Fprintln(w, scanner.Text())
}
}
上述解决方案使用输出缓冲,耗时 6.6 秒,而原来的 19.1 秒
添加输出缓冲和使用.Bytes()而不是.Text()输出的性能:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, _ := os.Open("test")
w := bufio.NewWriter(os.Stdout)
scanner := bufio.NewScanner(file)
for scanner.Scan() {
w.Write(scanner.Bytes()); w.WriteByte('\n')
}
}
上述解决方案使用输出缓冲并从扫描仪输出字节,并且需要 2.2 秒,而原来的 19.1 秒。
TA贡献1818条经验 获得超8个赞
首先考虑您将读取 CSV、JSON 的数据类型,以及将读取它的系统以及为什么?必须考虑所有这些细节。没有一种适合所有人的方式,最好的开发人员知道如何right tool使用job. 在不知道 ram 限制、数据等的情况下不清楚。我们会从服务器读取大量 JSON 吗?或者我们会解析一个小文本文件,通常每个函数都有一个目的。不要养成认为一种方式比另一种更好或更差的习惯,并限制你的学习和技能。
读取文件的方法。
文档解析
从文件中读取所有数据并将其转换为对象。
流解析
一次读取一个元素,然后移动到下一个元素。
有些方法可能更快,但它会将整个文件读入内存如果你的文件太大怎么办?
或者如果您的文件不是那么大,寻找重复的名称怎么办?如果您逐行扫描文件,也许如果您正在搜索多个项目,那么逐行阅读是最好的方式吗?
你应该看看这篇文章。特别感谢@Schwern,他已经在这里回答了您的问题。使用字节和扫描仪稍微快一些。见:链接
I found that using scanner.Bytes() instead of scanner.Text() improves speed
slightly on my machine. bufio's scanner.Bytes() method
doesn't allocate any additional memory, whereas Text() creates a string from its buffer.
- 2 回答
- 0 关注
- 414 浏览
添加回答
举报
