和 java 做了一下性能对比, regex 差不多只有 java 五分之一的速度。 Csv 简直是不能看。只有 Java 一半的速度。看了一下 pprof ,看起来是很多对象的分配和 GC 。难以置信。
1
kappa 2016-08-18 18:10:24 +08:00
|
2
janxin 2016-08-18 19:24:37 +08:00
regexp 的话 https://github.com/matloob/regexp 有很多人贡献了一些库可以更快。一些是对象分配 GC 问题,一些和算法也有关系。 csv 没用过,不过看起来 regexp 性能比 csv 差很多啊。
|
3
cloudzhou 2016-08-18 20:08:43 +08:00
我对这个很好奇,请问你 Java 使用的 CSV 库是什么,测试代码有吗?
|
4
bombless 2016-08-19 00:07:42 +08:00 via Android
不知道 ruby 现在表现的怎样。听说它最近也开始在 gc 中分代,对新生代使用 copying gc 。话说 copying gc 又能防止碎片产生,还能性能很高的话,早就把 mark - sweep 挤出市场了吧。是不是暴力 copying gc 其实表现很差。
|
5
vitovan 2016-08-19 08:30:18 +08:00
遇到重型 regex 需求基本都是上 re2:
https://github.com/google/re2 |
7
feuvan 2016-08-19 11:39:12 +08:00
|
8
hustlike OP @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 。这里都是从内存读进来。 |
9
hustlike OP @janxin 看这个对比: http://benchmarksgame.alioth.debian.org/u64q/performance.php?test=regexdna&sort=elapsed
差别不是一点点,就是直接抄 Java 的设计也不会这么烂啊。 |
10
janxin 2016-08-19 13:15:10 +08:00
|
11
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 |