Java正则表达式库基准测试– 2015年-程序员宅基地

技术标签: python  java  字符串  正则表达式  mysql  

在尝试使Java在计算机语言基准测试游戏regexdna挑战中排名第一时,我正在研究Java正则表达式库的性能。 我可以找到的最新网站是2010年的tusker.org 。因此,我决定使用Java Microbenchmarking Harness重做测试并发布结果(破坏性警告:某些非传统的解决方案使Java排名第一)。

TL; DR :正则表达式非常适合临时查询,但是如果您对性能敏感,则应手动编写解决方案代码(这并不意味着您必须从绝对零开始–例如,Google Guava库包含一些不错的实用程序 ,可以帮助编写可读性强的代码。

现在,对于一些总结性能的图表–该测试是在带有OpenJDK 1.8.0_66的64位Ubuntu 15.10计算机上运行的:

图片1

观察结果

  • 正则表达式没有“标准”,因此当给定特定的正则表达式和特定的字符串以进行匹配时,不同的库可能会有不同的行为-即。 一个可能会说它匹配,但另一个可能会说它不匹配。 例如,即使我使用了一组减少的测试用例(针对6个字符串检查了5个正则表达式),也只有两个库设法正确地匹配/不正确地匹配它们(其中一个是java.util.Pattern)。
  • 要使您的正则表达式正确,可能需要不止一次的尝试(例如regexpalRegex Coach之类的工具对于实验非常有用)
  • 正则表达式的性能很难预测(有时它可能会基于输入长度呈指数复杂性 )–因此,如果您接受Internet上任意用户的正则表达式(例如搜索引擎,例如允许使用正则表达式进行搜索)
  • 似乎没有一个库正在积极开发中(事实上, tusker.org上原始列表中的许多现在不可用),而且其中许多库都比内置的juPattern慢 ,因此, 如果使用正则表达式,可能是首选。
  • 这么说,硬件以及两者的性能JVM已经相当大,因此,如果您正在使用这些库之一,它通常是运行一个数量级的速度比它是在五年前。 因此,无需快速替换工作代码(除非您的探查器说这是个问题:-))
  • 注意循环中对String.split的调用。 尽管它针对特定情况(例如一字符正则表达式)进行了一些优化,但您几乎应该始终:
  • 这两个惊喜是dk.brics.automaton ,它的表现比其他所有产品都要好几个数量级,但是:
    • 最新版本是2011年,似乎是一个学术项目
  • 另一个惊喜是kmy.regex.util.Regex ,尽管自2000年以来未进行更新,但它的性能优于java.util.Pattern,并且通过了所有测试(当然并没有很多测试)。

使用的库的完整列表:

库名称和版本(发布年份) 在Maven Central中可用 执照 平均操作/秒 平均操作/秒(大文本) 通过测试
j.util.Pattern 1.8(2015) 否(JRE附带) JRE许可证 19689 22144 5之5
dk.brics.automaton.Automaton 1.11-8(2011) BSD 2 600 225 115374276 5分之2
org.apache.regexp 1.4(2005) 阿帕奇(?) 6738 16895 5之4
com.stevesoft.pat.Regex 1.5.3(2009) LGPL v3 4191 859 5之4
net.sourceforge.jregex 1.2_01(2002) BSD 57811 3573 5之4
kmy.regex.util.Regex 0.1.2(2000) 没有 艺术许可 217803 38184 5之5
org.apache.oro.text.regex.Perl5Matcher 2.0.8(2003) 阿帕奇2.0 31906 2383 5之4
gnu.regexp.RE 1.1.4(2005?) GPL(?) 11848 1509 5之4
com.basistech.tclre.RePattern 0.13.6(2015) 阿帕奇2.0 11598 43 5之3
com.karneim.util.collection.regex.Pattern 1.1.1(2005?) 5分之2
org.apache.xerces.impl.xpath.regex.RegularExpression 2.11.0(2014) 阿帕奇2.0 5之4
com.ibm.regex.RegularExpression 1.0.2(不再可用) 没有
RegularExpression.RE 1.1(不再可用) 没有
gnu.rex.Rex吗? (不再可用) 没有
monq.jfa.Regexp 1.1.1(不再可用) 没有
com.ibm.icu.text.UnicodeSet(ICU4J) 56.1(2015) ICU许可证


如果要重新运行测试,请签出源代码并按以下方式运行它:

# we need to skip tests since almost all libraries fail a test or an other
mvn -Dmaven.test.skip=true clean package
# run the benchmarks
java -cp lib/jint.jar:target/benchmarks.jar net.greypanther.javaadvent.regex.RegexBenchmarks

最后, 计算机语言基准游戏regexdna挑战如何? 我通过使用位操作检查8字节的块(如果它们可能匹配),从而使Java达到了#1的水平,然后仅对正则表达式进行了测试。 如前所述:如果要提高性能,则需要编写自定义解析器。

翻译自: https://www.javacodegeeks.com/2015/12/java-regular-expression-library-benchmarks-2015.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dnc8371/article/details/106814203

智能推荐

使用SaveAsPDFandXPS + jacob实现Java word转pdf-程序员宅基地

文章浏览阅读2k次。简介SaveAsPDFandXPS,微软官方提供的插件。必须是windows系统并且安装了office。下载和配置SaveAsPDFandXPS 下载地址 : http://www.microsoft.com/zh-cn/download/details.aspx?id=7Jacob 的jar包 下载地址 :https://sourceforge.net/projects/jacob..._saveaspdfandxps

java 发布订阅模式应用,前端异步解决方案-2(发布/订阅模式);-程序员宅基地

文章浏览阅读225次。什么是发布订阅模式什么是发布订阅模式我这里不多就不多阐述了,给大家提供几个我觉得讲的比较好的博文,请各位自行阅读发布-订阅模式解释 这一篇文章应该是一个java coder写的,但是设计模式这种东西并不分语言,各位可以借鉴一下Javascript中理解发布--订阅模式这一篇是我们前端人写的,但是比较长,大家有耐心可以看看发布中心实现我对发布中心的实现,可以不看(看了能够更好的理解发布订阅模式)//...

基础算法之区间合并学习笔记-程序员宅基地

文章浏览阅读98次。基础算法之区间合并学习笔记,暂时没有内容,稍后完成更新

【解决】fatal error: X11/XXXX.h: No such file or directory_fatal error: x11/x.h: no such file or directory-程序员宅基地

文章浏览阅读2.2w次,点赞17次,收藏28次。linux系统源码安装软件经常会遇到库文件不存在,错误信息大多如下:BBoard.c:27:28: error: X11/IntrinsicP.h: No such file or directoryBBoard.c:28:27: error: X11/Intrinsic.h: No such file or directoryBBoard.c:29:23: error: X11/Xutil.h_fatal error: x11/x.h: no such file or directory

CENTOS系统的配置_centto系统要什么配置的硬件-程序员宅基地

文章浏览阅读592次。/*** Title : CENTOS系统的配置** Author: 刘晨晖 ** Date : 2009-07-03** EMAIL : [email protected]** 转载请注明出处,谢谢合作!*/ 1.配网络# vi /etc/sysconfig/network-scripts/ifcfg-eth0_centto系统要什么配置的硬件

ABAP-动态程序生成-程序员宅基地

文章浏览阅读356次。科技越来越进步,人也就变的越来越懒,最终的演变就是大脑发达,四肢退化。。。AI的到来,准备接招吧。。。报表若没有过多的用户交互逻辑,一般可通过SQ01配置生成,本文介绍用ABAP方式实现报表程序的动态生成(程序是很久前从其他地方拷贝的,忘记了博文地址)。1.动态程序测试 输入程序名,设置表清单、表关联关系、查询字段、输出字段、附加字段等信息 点击按钮'生成程序',事务..._abap创建se38自动生成主体

随便推点

DVWA的碎碎念(ing)_file inclusion referer-程序员宅基地

文章浏览阅读271次。low sql injection1+2 / 3 数字型OR文本型’ or 1=1 # 显示表所有信息注释: $getid = SELECT * FROM tables WHERE ID = 变量$getid = SELECT * FROM tables WHERE ID = 变量 or 1=1使WHERE失去作用 不作筛选 暴露所有信息’ union 1,2 # 参数代入替换..._file inclusion referer

共享栈和双端队列_双端队列和共享栈-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏6次。共享栈和双端队列一、共享栈相比于普通的顺序栈,共享栈主要是为了提高内存的利用率和减少溢出的可能性而设计的。为了增加内存空间的利用率和减少溢出的可能性,当两个栈共享一篇连续的内存空间时,应将两栈的栈底分别设在这片内存空间的两端,这样当两个栈的栈顶在栈空间的某一位置相遇时,才产生上溢。二、双端队列双端队列是一种插入和删除操作在两端均可进行的线性表,可以把双端队列看成栈底连在一起的两个栈。他们与两个栈共享存储空间的共享栈的不同指出是,两个栈的栈顶指针式向两端延伸的。由于双端队列允许在两端插入和删除元素,_双端队列和共享栈

Jenkins配置ldap错误导致无法登陆的问题-程序员宅基地

文章浏览阅读4.8k次。为了方便用户管理,通过ldap集中式认证,让Gitlab和Jenkins都接入,这样就省去每个系统都是要创建用户的麻烦了。上一篇Jenkins整合ldap认证的文章中有网友发邮件说了,配置不当导致Jenkins无法登陆,可能文章未能详细说明。运维人员都会有这样的操作,修改任何配置文件前都会来一个备份。就是确保万一出错了可以回到之前的状态。所以建议就是Jenkins配置的问题,..._jenkins openldap 无法登陆

区域生长与分裂合并_区域生长、区域分割与合并算法-程序员宅基地

文章浏览阅读9k次,点赞8次,收藏76次。文章目录1.区域生长2.区域分裂与合并图像分割就是把图像分成若干特定的、具有独特性质的区域并提取出感兴趣目标的技术和过程,它是图像处理到图像分析的关键步骤。区域生长需要选择一组能正确代表所需区域的种子像素,确定在生长过程中的相似性准则,制定让生长停止的条件或准则。相似性准则可以是灰度级、彩色、纹理、梯度等特性。选取的种子像素可以是单个像素,也可以是包含若干像素的小区域。大部分区域生长准则使用图像..._区域生长、区域分割与合并算法

Android Arm64系统调用实现-程序员宅基地

文章浏览阅读1.4k次。本文主要基于clone系统调用分析在Arm64中代码流如何从用户态进入内核态,如何从内核态返回用户态,以及如何实现一次调用两次返回。Arm64总共有4个异常级别,这里主要讨论EL0和EL1这两个异常级别。当程序运行在用户态时是EL0,当程序运行在内核态时一般是EL1. 寄存器有两种,一种是普通寄存器,一种是特殊寄存器。汇编代码种常用的x0、x1等就是普通寄存器。而栈指针寄存器、程序状态寄存器、...

天天curd,怎么才能成长,跳离CRUD的苦海?_crud选手-程序员宅基地

文章浏览阅读724次。起因#“天天在那curd,也没啥技术含量”“你就是一个curd boy”“你就是一个curder啊”“你不写代码,你只是代码的搬运工”上面几句话,程序员是不是经常听到或者看到。这几句话说明了什么?高度概括能力:用几个单词组合,就概括了多数程序员日常的工作情况。 自嘲:自嘲有时是一种乐观的品质,用一种调侃的方式来看待自身情况。 乐观:上面说了,自嘲是乐观表现之一,但这种乐观中带着些许无奈。所以说,程序员还是很可爱的一群人儿。除了“自嘲”外,我们是不是应该多想一想,是不是应该多分析一_crud选手