Golang Go语言中 regex 和 csv 的使用体验如何
和 java 做了一下性能对比, regex 差不多只有 java 五分之一的速度。 Csv 简直是不能看。只有 Java 一半的速度。看了一下 pprof ,看起来是很多对象的分配和 GC 。难以置信。
Golang Go语言中 regex 和 csv 的使用体验如何
更多关于Golang Go语言中 regex 和 csv 的使用体验如何的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
regexp 的话 https://github.com/matloob/regexp 有很多人贡献了一些库可以更快。一些是对象分配 GC 问题,一些和算法也有关系。 csv 没用过,不过看起来 regexp 性能比 csv 差很多啊。
我对这个很好奇,请问你 Java 使用的 CSV 库是什么,测试代码有吗?
不知道 ruby 现在表现的怎样。听说它最近也开始在 gc 中分代,对新生代使用 copying gc 。话说 copying gc 又能防止碎片产生,还能性能很高的话,早就把 mark - sweep 挤出市场了吧。是不是暴力 copying gc 其实表现很差。
遇到重型 regex 需求基本都是上 re2:
https://github.com/google/re2
r#5 貌似没有 golang 的 wrapper.
Java 用的是 apache 的 commons-io. Go 测试代码:<br>r := csv.NewReader(bytes.NewReader(source))<br> return r.ReadAll()<br>
Java 的是:<br>CSVFormat.EXCEL.withQuoteMode(QuoteMode.MINIMAL).withFirstRecordAsHeader().parse(new BufferedReader(new StringReader(source)))<br>
测试 1 百万行 Csv 。这里都是从内存读进来。
看这个对比: http://benchmarksgame.alioth.debian.org/u64q/performance.php?test=regexdna&sort=elapsed
差别不是一点点,就是直接抄 Java 的设计也不会这么烂啊。
你这个锅应该第三方库背啊,这明显是第三方库的问题…
https://github.com/wordijp/golang-re2 ,这个也就是 5.947s
因为算法不一样[1]。 Go 的 regexp 采用的是一个线性算法,没有最差的情形出现,但通常情况下会慢一些(当然,也和它优化的不够有关)。不过已经有 port re2 过来的打算2。
同样,可以对比下 net/http 和 fasthttp 的性能,后者秒杀前者,但为啥不直接使用后者?跑分的意义没有那么重要。真要是实际使用中 regexp 这么慢,出现什么大问题,那么这个问题的优先级肯定很高,会优先解决。但实际上, regexp 确实需要改进,只是优先级不高而已。
[1] https://swtch.com/~rsc/regexp/regexp1.html
[2] https://github.com/golang/go/issues/11646
在Golang(Go语言)中,regex
(正则表达式)和csv
(逗号分隔值)的处理都相当高效且直观,为开发者提供了便捷的工具来处理文本和结构化数据。
对于regex
,Go语言内置的regexp
包提供了强大的正则表达式功能。这个包易于使用,接口设计清晰,能够处理复杂的模式匹配和文本替换任务。开发者可以轻松地编写正则表达式来查找、提取或修改字符串中的特定内容。regexp
包还支持编译正则表达式以提高匹配性能,对于需要频繁匹配的场景尤为有用。
在处理CSV文件时,Go语言的encoding/csv
包同样表现出色。这个包提供了简洁的API来读取和写入CSV数据。开发者可以轻松地解析CSV文件,将其转换为二维切片或自定义的结构体,也可以将结构体或切片数据写入CSV文件。encoding/csv
包还支持自定义分隔符、引号字符等,以满足不同格式的CSV文件处理需求。
总的来说,Go语言中的regex
和csv
处理功能都非常强大且易于使用。这两个包都经过精心设计和优化,提供了高效且可靠的文本和结构化数据处理能力。无论是处理复杂的文本模式匹配任务,还是解析和生成CSV文件,Go语言都能为开发者提供强大的支持。因此,对于需要处理这些任务的Go语言开发者来说,regexp
和encoding/csv
包无疑是不可或缺的工具。