我正在尝试通过 GO (Golang) 程序流式传输(很多)用户代理,以提取有关这些 ua 代理的不同信息,如设备类型、操作系统等。
Tobie Langel 的 UA Parser Repo 中的 GO 代码看起来很有前途:
https://github.com/tobie/ua-parser/tree/master/go/uaparser
我创建了一个简单的程序,主要是在自述文件页面上的示例中添加了流媒体功能。为了比较性能,我使用 Ruby 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))
}
}
最佳答案
我会考虑 rubex图书馆。我将 ua-parser 改为使用 rubex,速度提高了 7 倍。该库声称有 10 倍的改进,所以我会在您的特定应用程序中尝试一下。
关于ruby - 在 GO (Golang) 中解析用户代理 - Tobie/ua-parser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20133606/