在GO(Golang)中解析用户代理 - Tobie / ua-parser

时间:2013-11-21 22:53:19

标签: ruby regex go user-agent

我试图通过GO(Golang)程序流式传输(大量)用户代理,以提取有关这些ua代理的不同信息,如设备类型,操作系统等。

Tobie Langel的UA Parser Repo中的GO代码看起来很有希望:

https://github.com/tobie/ua-parser/tree/master/go/uaparser

我创建了一个简单的程序,其中我基本上在README页面上为示例添加了流功能。为了比较性能,我使用Ruby gem创建了相同类型的简单程序,该gem使用类似的方法和相同的regexes.yaml文件。

https://github.com/toolmantim/user_agent_parser

编译Go程序并测试两者后,Ruby版本的运行速度比GO版本快2-3倍。

据我所知,这两个程序都以类似的方式加载和处理ua代理。

我是GO的新手,我想知道是否有人看到任何可能使使用此repo的GO部分的程序运行得更快的主要优化或修复。

我也有兴趣知道是否有人知道我可以用来解析运行良好的用户代理的任何其他GO库。

---测试简单程序以比较REGEX和PCRE LIBS(如以下评论中所示)

我创建了以下程序,一个使用PCRE,一个使用标准正则表达式库。但是,我似乎没有通过PCRE获得性能提升。事实上,PCRE库似乎有点慢。我是以错误的方式接近这个吗?

- 使用标准的正则表达式库

package main

import (
  "fmt"
  "regexp"
  "strings"
  "bufio"
  "os"
)

func main() {

  var regex = regexp.MustCompile(`Mac`)
  scanner := bufio.NewScanner(os.Stdin)

  for scanner.Scan() {

    line := scanner.Text()
    fields := strings.Split(line, "\t")
    fmt.Println(regex.FindIndex([]byte(fields[0])))

  }

}  

- 使用PCRE库

package main

import (
  "fmt"
  pcre "github.com/glenn-brown/golang-pkg-pcre/src/pkg/pcre"
  "bufio"
  "os"
  "strings"
)

func main() {

  scanner:= bufio.NewScanner(os.Stdin)
  var regex = pcre.MustCompile(`Mac`, 0)

  for scanner.Scan() {

    line := scanner.Text()
    fields := strings.Split(line, "\t")
    fmt.Println(regex.FindIndex([]byte(fields[0]),0))

 }
}  

1 个答案:

答案 0 :(得分:1)

我会考虑rubex库。我改变了ua-parser而不是使用rubex,我看到了7倍的速度提升。图书馆声称改进了10倍,所以我会尝试使用您的特定应用程序。