golang regex 和 csv 这么屎

2016-08-18 17:57:59 +08:00
 hustlike

和 java 做了一下性能对比, regex 差不多只有 java 五分之一的速度。 Csv 简直是不能看。只有 Java 一半的速度。看了一下 pprof ,看起来是很多对象的分配和 GC 。难以置信。

2015 次点击
所在节点    Go 编程语言
11 条回复
kappa
2016-08-18 18:10:24 +08:00
janxin
2016-08-18 19:24:37 +08:00
regexp 的话 https://github.com/matloob/regexp 有很多人贡献了一些库可以更快。一些是对象分配 GC 问题,一些和算法也有关系。 csv 没用过,不过看起来 regexp 性能比 csv 差很多啊。
cloudzhou
2016-08-18 20:08:43 +08:00
我对这个很好奇,请问你 Java 使用的 CSV 库是什么,测试代码有吗?
bombless
2016-08-19 00:07:42 +08:00
不知道 ruby 现在表现的怎样。听说它最近也开始在 gc 中分代,对新生代使用 copying gc 。话说 copying gc 又能防止碎片产生,还能性能很高的话,早就把 mark - sweep 挤出市场了吧。是不是暴力 copying gc 其实表现很差。
vitovan
2016-08-19 08:30:18 +08:00
遇到重型 regex 需求基本都是上 re2:
https://github.com/google/re2
vitovan
2016-08-19 08:31:06 +08:00
r#5 @vitovan 貌似没有 golang 的 wrapper.
feuvan
2016-08-19 11:39:12 +08:00
hustlike
2016-08-19 11:51:11 +08:00
@cloudzhou Java 用的是 apache 的 commons-io. Go 测试代码:
```
r := csv.NewReader(bytes.NewReader(source))
return r.ReadAll()
```
Java 的是:
```
CSVFormat.EXCEL.withQuoteMode(QuoteMode.MINIMAL).withFirstRecordAsHeader().parse(new BufferedReader(new StringReader(source)))
```
测试 1 百万行 Csv 。这里都是从内存读进来。
hustlike
2016-08-19 11:51:51 +08:00
@janxin 看这个对比: http://benchmarksgame.alioth.debian.org/u64q/performance.php?test=regexdna&sort=elapsed
差别不是一点点,就是直接抄 Java 的设计也不会这么烂啊。
janxin
2016-08-19 13:15:10 +08:00
@hustlike 你这个锅应该第三方库背啊,这明显是第三方库的问题...

https://github.com/wordijp/golang-re2 ,这个也就是 5.947s
hooluupog
2016-08-19 15:49:55 +08:00
@hustlike 因为算法不一样[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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/300233

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX