Java正则表达式库基准测试– 2015年

在尝试使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)。
  • 要使您的正则表达式正确,可能需要不止一次的尝试(例如regexpal或Regex Coach之类的工具对于实验非常有用)
  • 正则表达式的性能很难预测(有时它可能会基于输入长度而呈指数复杂性 )–因此,如果您接受Internet上任意用户的正则表达式(例如搜索引擎,例如允许使用正则表达式进行搜索)
  • 似乎没有一个库正在积极开发中(事实上, tusker.org上原始列表中的许多库现在不可用),而且其中许多库都比内置的juPattern慢 ,因此, 如果使用正则表达式,可能是首选。
  • 这么说,硬件以及两者的性能JVM已经相当大,因此,如果您正在使用这些库之一,它通常是运行一个数量级的速度比它是在五年前。 因此,无需快速替换工作代码(除非您的探查器说这是个问题:-))
  • 注意循环中对String.split的调用。 尽管它针对特定情况(例如一字符正则表达式)进行了一些优化,但您几乎应该始终:
    • 看看是否可以使用Google Guava的Splitter之类的工具
  • 这两个惊喜是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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言写程序注意,单片机C语言编程应注意的若干问题

作为一种结构化的程序设计语言,C语言的特点就是可以使你尽量少地对硬件进行操作,具有很强的功能性、结构性和可移植性,常常被优选作为单片机系统的编程语言。但是基于单片机的C语言和标准C语言有很大区别,如何结合单片机的系统资源…

Java实现将日志信息存到TXT中

在java文件操作的时候,思考将日志信息存到txt中,现在很多项目都是通过log4j来做的,同样也会用到将日志存到txt中. package FileOperation;import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Calenda…

接口返回的类型是html页面_1.10 PhalApi 2.x 接口文档

接口文档在线接口文档PhalApi提供一些非常实用而又贴心的功能特性,其中最具特色的就是自动生成的在线可视化文档。在线接口文档主要分为两大类,分别是: 在线接口列表文档在线接口详情文档当客户端不知道有哪些接口服务,或者需要查…

c语言变量相等问题穷举法,C语言穷举法经典例题.ppt

《C语言穷举法经典例题.ppt》由会员分享,可在线阅读,更多相关《C语言穷举法经典例题.ppt(18页珍藏版)》请在人人文库网上搜索。1、枚举法(穷举法),“笨人之法”: 把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出。,分…

jmeter数据库负载测试_JMeter:负载测试关系数据库

jmeter数据库负载测试Apache JMeter是完全使用Java编写的性能测试工具。 可以在请求/响应模型上运行的任何应用程序都可以使用JMeter进行负载测试。 关系数据库也不例外:接收sql查询,执行查询并返回执行结果。 我将向您展示使用JMeter的图形用户界面设置…

python requests编码的问题_python requests 编码问题

url host pathheaders {...}data {...}files {...}files两种类型: 字典和 元组{"field1" : ("filename1", open("filePath1", "rb")),"field2" : ("filename2", open("filePath2", "rb"…

图片热区map-area

自适应图片热区坐标&#xff1a; html: <div id"imgContainer" > <img src"../../assets/flow_chart.jpg" id"flowImg" alt"流程图" style"width:100%;height:100%;" usemap"#flowChartImg"> <…

c语言编程计算人口增长模式转变示意图,读“人口增长模式及其转变示意图”,回答下列问题。(5分)(1)图中字母代表的人口增长模式是:A____________、B____...

读“人口增长模式及其转变示意图”&#xff0c;回答下列问题。(5分)(1)图中字母代表的人口增长模式是&#xff1a;A____________、B____更多相关问题According to your textbook, the following statement is an example of __________. "when Tiger Wo键盘输入一个班n个学…

具有Couchbase,Java EE和WildFly的CRUD Java应用程序

Couchbase是一个开源的NoSQL文档数据库。 它允许访问&#xff0c;索引和查询JSON文档&#xff0c;同时利用集成的分布式缓存来实现高性能的数据访问。 开发人员可以使用不同的语言&#xff08;Java&#xff0c;Go&#xff0c;.NET&#xff0c;Node&#xff0c;PHP&#xff0c;…

python定时下载链接_python定时下载FTP指定文件

公司正好有个需求&#xff0c;定期从远端ftp下载指定昨天的数据&#xff0c;写了2个函数&#xff0c;一个是连接远端ftp&#xff0c;另一个是定期下载远端数据&#xff0c;用到了ftplib、datetime和正则re三个模块1.ftplib:连接和下载ftp数据2.datetime:指定下载日期--每天的前…

c语言10个人 三向成绩,C语言入门学习精华:这样学习C语言最有效

C语言入门学习精华&#xff1a;这样学习C语言最有效c语言死了吗&#xff1f;本材料描述了使用C语言的高级技能&#xff0c;并努力将您的C语言能力从“基本”提升到“高级”。然而&#xff0c;学习态度比学习方法要好。在正式学习之前&#xff0c;有一个问题是不能抱怨的。也就是…

jQuery UI全教程之一(dialog的使用教程)

jQuery UI目前的版本已经更新到了1.8.7。个人感觉和easyui相比起来&#xff0c;jQuery UI在界面的美观程度和可定制型更强一些。所以再次将一些jQuery UI组件的用法说明一下&#xff0c;方便日后查阅。也方面没接触jQuery UI的人能早日使用jQuery UI套件 (一)首先来说jQuery UI…

python使用redis做缓存_Python中的Redis客户端缓存(二)

Python部落(python.freelycode.com)组织翻译&#xff0c;禁止转载&#xff0c;欢迎转发。处理失效无效消息如何发送到被追踪的客户端取决于客户端正在使用的Redis序列化协议(RESP)。早期版本的Redis使用RESP2&#xff0c;但是它的后续版本RESP3已经存在于Redis 6中&#xff0c;…

c语言中有哪些函数关系,C语言中有哪些常用的函数

C语言中有哪些常用的函数发布时间&#xff1a;2020-11-17 17:01:32来源&#xff1a;亿速云阅读&#xff1a;107作者&#xff1a;小新这篇文章主要介绍C语言中有哪些常用的函数&#xff0c;文中介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们一定要…

akka es/cqrs_在Akka中实现主从/网格计算模式

akka es/cqrs主从模式是容错和并行计算的主要示例。 模式背后的想法是将工作划分为相同的子任务&#xff0c;然后将其委派给从属。 这些从属节点或实例将处理工作任务&#xff0c;并将结果发送回主节点。 然后主节点将编译从所有从节点接收到的结果。关键是从节点仅知道如何处理…

05 HTML字符串转换成jQuery对象、绑定数据到元素上

1 要求 将一段 HTML脚本 封装成一个字符串&#xff0c;将这个字符串转换成一个jQuery对象&#xff1b;然后将这个jQuery对象添加到指定的元素中去 2 步骤 定义字符串 var str <div id"box01">hello world</div>; //定义一个字符串 利用jQuery框架将字符…

python迭代器使用_Python迭代器的用法

我们在前面使用过语句“for x in列表对象”&#xff0c;这就表示列表对象是可迭代的(Iterable)。那么如何判断某个对象是否可迭代呢&#xff1f;答案是可以使用collections.Iterable类来判断。如下面的代码所示&#xff0c;列表是可迭代的&#xff0c;整数是不可迭代的&#xf…

c语言求佩尔方程的解设计思路,c语言版 佩尔方程求最小正整数解及第k解(矩阵快速幂)...

佩尔方程讲解连接&#xff1a;若一个丢番图方程具有以下的形式&#xff1a;且为正整数&#xff0c;则称此方程为佩尔方程(英文&#xff1a;Pells equation 德文&#xff1a;Pellsche Gleichung) 若是完全平方数&#xff0c;则这个方程式只有解(实际上对任意的&#xff0c;都是解…

在Java EE 7中自动配置JMS资源

JMS 2.0&#xff08;Java EE 7平台的一部分&#xff09;引入了许多不错的功能 。 其中之一是能够声明JMS资源以进行自动部署。 Java EE 7之前的版本 使用Resource注入连接工厂 使用Resource查找目标位置&#xff08;队列/主题&#xff09; 拉出Session对象并使用它创建Messa…

python关键词提取源码_Python 结巴分词 关键词抽取分析

关键词抽取就是从文本里面把跟这篇文档意义最相关的一些词抽取出来。这个可以追溯到文献检索初期&#xff0c;当时还不支持全文搜索的时候&#xff0c;关键词就可以作为搜索这篇论文的词语。因此&#xff0c;目前依然可以在论文中看到关键词这一项。除了这些&#xff0c;关键词…