嵌入式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,一经查实,立即删除!

相关文章

java决策树_【Java】决策树介绍和使用

现在生活中,越来越多的时候 需要进行判断和决策,因此关于怎么去判断和决策,需要根据一定的依据进行判断和决策,并不是凭空的按照自己的意愿去判断和决策,就比如举个例子; 假如甲同学准备结婚,但…

C++ 【随想录】(五)C 文件操作

#include<iostream> #include<cstdio> using namespace std;int main() {FILE *fp1 NULL; //指向源文件FILE *fp2 NULL; //指向目的文件char *byBuffNULL; //缓存int fileBytes 0; //文件大小const char* pSrc "M3.264";const char* pDest "M…

stackoverflow_Stackoverflow的见解:投票最多的是Spring 4问题

stackoverflow在Stackoverflow上对Spring 4问题进行投票和回答最多的是什么&#xff1f; 以下是最常见的五个问题和解答。 Spring中的 Component&#xff0c; Controller&#xff0c; Repository和Service批注有什么区别&#xff0c;它们可以互换使用还是具有特定功能&#xf…

java 编译顺序_关于java中一次编译多个源文件时的编译顺序的问题

为了节省回答者的时间我先把问题提出来&#xff0c;再针对问题案例作详细说明。如果能不用看问题案例就回答出来当然省时。我的问题是java里面&#xff0c;用命令行提示符环境编译源文件的时候&#xff0c;加上*通配符...为了节省回答者的时间我先把问题提出来&#xff0c;再针…

宏定义细节

#define PI(a,b) ab //分析 /* PI(a,b)a,b是参数 后面的ab进行运算 返回值作为PI的宏定义

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

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

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

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

浅谈人工智能

所谓人工智能&#xff0c;主旨是让它有用“自己的思维模式”

java timer开销_减少Java垃圾收集开销的5条提示

java timer开销保持较低的GC开销的一些最有用的技巧是什么&#xff1f; 随着Java 9即将再次延迟发布&#xff0c;G1&#xff08;“垃圾优先”&#xff09;垃圾收集器将设置为HotSpot JVM的默认收集器。 从串行垃圾收集器一直到CMS收集器&#xff0c;JVM在其整个生命周期中都见…

C++STL Vector

#include<iostream> #include<vector> using namespace std;int main() {//vector构造函数vector<int>A(); //无参数&#xff0c;构造一个空的vectorvector<int>B(10, 1);//数量(num)和值(val) - 构造一个初始放入num个值为val的元素的Vector vector&…

java serializable 源码_Java源码分析之-Serializable接口

一、基本概念Serializable接口&#xff1a;1. 实现了Serializable接口的类&#xff0c;可以进行序列化和反序列化&#xff1b;没有实现这个接口的类的任何(state)状态/域或者属性值不能被序列化2. All subtypes of a serializable class are themselves serializable. 所有实现…

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

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

快速排序 自带时间复杂度检测

//时间复杂度 O(N*log2N //稳定性&#xff1a;不稳定 //来源于分治思想 /* 确定分界点 调整区间 递归处理两端算法思想&#xff0c;快排是基于冒泡排序的优化&#xff0c;冒泡排序从一侧开始进行&#xff0c;而快排是两边同时进行从而时间复杂度折半&#xff0c;同时包含了二…

java arraylist 常用方法_分享ArrayList中的几个常用方法的源码

jdk1.7.0_79上文里解析了有关ArrayList中的几个常用方法的源码——《有关ArrayList常用方法的源码解析》&#xff0c;本文将对LinkedList的常用方法做简要解析。LinkedList是基于链表实现的&#xff0c;也就是说它具备了链表的优点和缺点&#xff0c;随机访问慢、插入删除速度快…

java8 streams_Java 8 Streams API:对流进行分组和分区

java8 streams这篇文章展示了如何使用Streams API中可用的Collectors将具有groupingBy的流元素和具有partitioningBy的流元素进行groupingBy 。 考虑一系列Employee对象&#xff0c;每个对象都有名称&#xff0c;城市和销售数量&#xff0c;如下表所示&#xff1a; ---------…

【FFMPEG应用篇】使用FFMPEG解析H264编码为YUV格式

头文件 #pragma once#ifndef _VIDEO_DECODING_HEADER_ #define _VIDEO_DECODING_HEADER_#define INBUF_SIZE 4096 #define AUDIO_INBUF_SIZE 20480 #define AUDIO_REFILL_THRESH 4096extern "C" { #include "libavutil/opt.h" #include "libavcodec/…

java 反射api_Java学习笔记--反射API

反射API1.反射API的介绍通过反射API可以获取Java程序在运行时刻的内部结构。比如Java类中包含的构造方法、域和方法等元素&#xff0c;并可以与这些元素进行交换。按照 一般地面向对象的设计思路&#xff0c;一个对象的内部状态都应该通过相应的方法来改变&#xff0c;而不是直…

c++各类型有效范围

int -2147483648 ~ 2147483647 float 有6-7位有效数字 double 有15-16位有效数字

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

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

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

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