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

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

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

观察结果

  • 正则表达式没有“标准”,因此当给定特定的正则表达式和特定的字符串以进行匹配时,不同的库可能会有不同的行为-即。 一个可能会说它匹配,但另一个可能会说它不匹配。 例如,即使我使用了一组减少的测试用例(针对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

Java正则表达式库基准测试– 2015年相关推荐

  1. 嵌入式java基准测试_Java正则表达式库基准测试– 2015年

    嵌入式java基准测试 在尝试使Java在计算机语言基准游戏的regexdna挑战中排名第一时,我正在研究Java正则表达式库的性能. 我可以找到的最新网站是2010年的tusker.org .因此, ...

  2. JAVA 正则表达式 (超详细,转)

    转 JAVA 正则表达式 (超详细,转) 2015年03月25日 10:27:57 阅读数:1514 在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍 ...

  3. Java正则表达式:我最期望弄懂的知识,希望对大家都有帮助

    在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包. 可粗略估计一下,除了偶尔用Linux的外,其他Linu ...

  4. JAVA 正则表达式 (超详细) .

    2019独角兽企业重金招聘Python工程师标准>>> 在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util ...

  5. Java正则表达式(超详细)

    学习Java的同学注意了!!!  学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:183993990  我们一起学Java! 在Sun的Java JDK 1.40版本 ...

  6. Java正则表达式(详解)

    (PS:这篇文章为转载,我不喜欢转载的但我觉得这篇文章实在是超赞了,就转了过来,这篇可以说是学习JAVA正则表达的必读篇.作者是个正真有功力的人,阅读愉快) 在Sun的Java JDK 1.40版本中 ...

  7. JAVA 正则表达式 (超详细)

    新网站上线 欢迎大家 网站交易中心 在这里你可以购买或者出售你的网站. 网站信息发布中心 在这里有各种交易信息的发布.同时提供 一些软件的免费使用(附有源码). 网站博客系统 这里你可以注册自己的博客 ...

  8. java 正则表达式 (本文系转载,百度了一下,没找到原博客,或者作者,找了一篇2008年的贴过来了╮(╯▽╰)╭)

    参考文章地址: 一     JAVA 正则表达式 (超详细)   http://blog.csdn.net/allwefantasy/article/details/3136570/  (强烈推荐,有 ...

  9. JAVA正则表达式(详细,转载内容)

    可粗略估计一下,除了偶尔用Linux的外,其他Linu x用户都会遇到正则表达式.正则表达式是个极端强大工具,而且在字符串模式-匹配和字符串模式-替换方面富有弹性.在Unix世界里,正则表达式几乎没有 ...

最新文章

  1. 1045 快速排序 (25分)
  2. 为什么 Kafka 如此之快?
  3. 嵌入式系统的知识体系、学习误区及学习建议
  4. k1075停运吗_怀化火车站(怀化火车停运最新消息)
  5. python语言整数类型-Python 的内置数值类型
  6. 计算机二级web题目(7.4)--综合应用题1
  7. C++和Lua交互教程(基于LuaBridge)
  8. docker 镜像命令
  9. Spark内核解析之二:Spark 部署模式
  10. Qcon2017实录|Service Mesh:下一代微服务
  11. 数据库课程设计专题-数据库课程设计大作业作业列表【建议在校生收藏】
  12. css 文本和div垂直居中方法汇总
  13. 数据库查询数据去除重复
  14. 信息课为什么不叫计算机课,让信息技术课“美”起来
  15. 如何提高商城的转化率
  16. Why WPF's Text is Blurry?
  17. 社保账号按身份证查询
  18. 2022 Q2 GO开发者问卷调查结果
  19. 如何把canvas元素作为网站背景总结详解
  20. 计算机excel按F4是那个公式,功能键F4你真的会用?Excel四大F4快捷操作,轻松解决工作中问题...

热门文章

  1. 一个朋友的一天,太酸了!
  2. 红歌合唱之团结就是力量
  3. 《四世同堂》金句摘抄(七)
  4. ArrayList基操
  5. Android 获取屏幕宽度和高度直接转换为DP
  6. java谓词_在Java中谓词
  7. 去掉字符串后面所有的0 去掉字符串前面或后面的0;
  8. mysql的on和in用法_数据库中in、on、with的用法及示例。
  9. 注解@resource的作用_Bean基于Annotation(注解)的装配方式
  10. mysql 表字段信息从一张表迁移到另一张表_MySQL(数据库)笔记