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

嵌入式java基准测试

在尝试使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

嵌入式java基准测试

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

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

相关文章

libgdx和unity_libgdx和Kotlin –类[2D平台原型]

libgdx和unity这篇文章是libgdx和Kotlin文章的后续文章。 我已经决定开发一个简单的2D平台程序的原型(沿着我的早期文章中的Star Assault进行介绍),但是我一直在使用和学习Kotlin,而不是Java。 对于本教程,该项目应处…

java1.7开发环境_在Windows平台搭建Java 1.7开发环境

OS:Windows 7 or laterJava Version: 1.7.x本文具体的演示环境是:Windows 8.1,Java 1.7.0_45。一、安装JDK需要注意的是安装路径中不要出现非西文符号。实际上我一般喜欢在安装路径中也尽可能不出现空格。比如:在我的PC上&#xf…

gluon_带有Gluon Ignite和Dagger的JavaFX中的依赖注入

gluon依赖注入抽象框架Gluon Ignite在几个流行的依赖注入框架(例如Spring,Dagger和Guice)上创建了一个通用抽象。 目前,Gluon 页面仅包含一个示例,该示例使用Gluon Ignite和Google Guice作为依赖注入框架,…

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

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

java 对象的态_Java面向对象-------多态总结

1.多态:是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:多态性是对象多种表现形式的体现。2.多态作用:1. 消除类型之间的耦合关系2. 可替换性3. 可扩充性4…

netbeans连接数据库_NetBeans Java EE技巧#1 –数据库中的实体类

netbeans连接数据库NetBeans IDE是开发各种应用程序的绝佳选择。 具体来说,我每天都使用它来开发和维护Java EE应用程序。 在过去的几个发行版中,不仅Java EE的生产力提高了,而且NetBeans IDE还减少了开发应用程序的时间……使Java EE和NetBe…

jboss fuse 教程_使用JBoss Fuse和OpenShift进行Cloud Native Camel骑行

jboss fuse 教程红帽公司最近发布了一个微服务集成工具包,用于在OpenShift v3的Docker和Kubernetes环境中运行我们的微服务。 为了帮助人们更好地理解这一点,我将Rider Auto应用程序迁移到一组微服务中,该应用程序已经存在了一段时间&#xf…

javaone_JavaOne 2015 –又一年,又向前迈进了一步

javaoneJavaOne 2015 San Francisco于10月25日至29日举行。 我很自豪地说这是我第九个人参加JavaOne,第七个人是演讲者,第四个人是Oracle员工,第三个人是内容委员会成员,第二个人是项目负责人。 我认为对于JavaOne来说&#xff0c…

lnp和mysql分开安装_毕业设计之LNP+DISCUZ +分离的数据库操作

环境介绍:CentOS6.9最小化安装https://nginx.org/download/nginx-1.16.1.tar.gzhttps://www.php.net/distributions/php-7.3.14.tar.gzhttps://cdn.mysql.com//Downloads/MySQL-5.7/mysql-boost-5.7.29.tar.gznginxphp主机:192.168.111.141mysql主机&…

java中hotspot_Java 8中HotSpot选项的改进文档

java中hotspotOracle的HotSpot Java 8实现中引入的一些小但受欢迎的功能之一是在启动器的文档中添加了许多常见的HotSpot Java启动器 ( java )选项/标志。 过去,甚至对某些相当常见的HotSpot JVM选项都感兴趣的开发人员不得不潜在地寻找多个不…

qchart折现图_Qt开发技术:QCharts(二)QCharts折线图介绍、Demo以及代码详解

若该文为原创文章,未经允许不得转载各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究敬请期待…红胖子,来也!介绍了整体框架,开始动手码代码,按照顺…

各类算法思想

暴力枚举法 使用场景注意事项 1.建立一个简洁的搜索模型,变量尽可能少 2.尽可能减少搜索空间 递归与分治法 分治使用最广泛一类算法。采用递归的思想将较大规模的问题分成小问题来求。如果原问题可以分割成k个子问题,并且这些子问题可以重复利用&am…

eclipse neon_在自定义Java 9映像上运行Eclipse Neon

eclipse neon我已经开始修改自定义Java二进制运行时映像文件。 映像文件是打包为运行时平台的模块的配置。 基本上,默认映像包含组成Java运行时的所有内容。 自定义图像可以包含该图像的一些子集。 例如,我创建了一个仅包含“ compact 3”概要文件的映像…

java json注解_返回json用什么注解

返回json用“ResponseBody”注解,“ResponseBody”是作用在方法上的,“ResponseBody”表示该方法的返回结果直接写入“HTTP response body”中。本篇文章将介绍两种示例进行JSON返回注解方式演示。示例1ResponseBody是作用在方法上的,Respons…

java数据结构博客园_常见数据结构的Java实现

单链表的Java实现首先参考wiki上的单链表说明,单链表每个节点包含数据和指向链表中下一个节点的指针或引用。然后看代码import java.lang.*;public class SinglyLinkeList{Node start;public SinnglyLinkedList(){this.startnull;}public void addFront(Object newD…

jboss4 java_带有JBoss工具的OpenShift 3上的Java EE 7应用程序

jboss4 java您可以使用最新版本的JBoss Tools OpenShift插件在Eclipse中创建和管理OpenShift应用程序。 他们要么预先捆绑了最新的 JBoss Developer Studio(9.0.0.GA) ,也可以将它们安装到现有的Eclipse Mars中。 这篇文章将引导您通过JBoss…

javaslang_使用Javaslang的Java 8中的功能数据结构

javaslangJava 8的lambda(λ)使我们能够创建出色的API。 它们极大地提高了语言的表达能力。 Javaslang利用lambda来基于功能模式创建各种新功能。 其中之一是功能性集合库,旨在替代Java的标准集合。 (这只是鸟瞰图,您…

java调用kafka接口发送数据_Java调用Kafka生产者,消费者Api及相关配置说明

本次的记录内容包括:1.Java调用生产者APi流程2.Kafka生产者Api的使用及说明3.Kafka消费者Api的使用及说明4.Kafka消费者自动提交Offset和手动提交Offset5.自定义生产者的拦截器,分区器那么接下来我就带大家熟悉以上Kafka的知识说明1.Java调用生产者APi流…

java如何模拟请求_单元测试如何模拟用户请求

python web自动化测试设计构工具书40.9元包邮(需用券)去购买 >错误正当我高高兴兴写完后台c层的测试代码准备提交时,测试机器人报了很多401错误,把代码拉下来一看,原来当我写代码时,我的伙伴已经写好后台的拦截器了&#xff0c…

LeetCode 83. 删除排序链表中的重复元素

原题链接 解法:通过一个指针从头到尾进行扫描 class Solution { public:ListNode* deleteDuplicates(ListNode* head) {if(!head)return nullptr;auto p1 head;while(p1->next){if(p1->next->val p1->val)p1->nextp1->next->next;else p1 …