V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
hustlike
V2EX  ›  Go 编程语言

golang regex 和 csv 这么屎

  •  1
     
  •   hustlike · 2016-08-18 17:57:59 +08:00 · 2092 次点击
    这是一个创建于 3030 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    https://github.com/wordijp/golang-re2 ,这个也就是 5.947s
    hooluupog
        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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5915 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 02:16 · PVG 10:16 · LAX 18:16 · JFK 21:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.