正则表达式 guava_带有正则表达式模式的Google Guava Cache

正则表达式 guava

最近我看到了一个关于Google Guava的不错的介绍 ,我们在我们的项目中得出结论,使用它的缓存功能真的很有趣。 让我们看一下regexp Pattern类及其编译功能 。 在代码中我们经常可以看到,每次使用正则表达式时,程序员都会使用相同的参数重复调用上述Pattern.compile()函数,从而一次又一次地编译相同的正则表达式。 但是,可以做的是缓存此类编译的结果–让我们看一下RegexpUtils实用程序类:

RegexpUtils.java

package pl.grzejszczak.marcin.guava.cache.utils;import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;import java.util.concurrent.ExecutionException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import static java.lang.String.format;public final class RegexpUtils {private RegexpUtils() {throw new UnsupportedOperationException("RegexpUtils is a utility class - don't instantiate it!");}private static final LoadingCache<String, Pattern> COMPILED_PATTERNS =CacheBuilder.newBuilder().build(new CacheLoader<String, Pattern>() {@Overridepublic Pattern load(String regexp) throws Exception {return Pattern.compile(regexp);}});public static Pattern getPattern(String regexp) {try {return COMPILED_PATTERNS.get(regexp);} catch (ExecutionException e) {throw new RuntimeException(format("Error when getting a pattern [%s] from cache", regexp), e);}}public static boolean matches(String stringToCheck, String regexp) {return doGetMatcher(stringToCheck, regexp).matches();}public static Matcher getMatcher(String stringToCheck, String regexp) {return doGetMatcher(stringToCheck, regexp);}private static Matcher doGetMatcher(String stringToCheck, String regexp) {Pattern pattern = getPattern(regexp);return pattern.matcher(stringToCheck);}}

如您所见,如果没有找到,则使用带有CacheBuilder的Guava的LoadingCache来填充具有新编译模式的缓存。 由于缓存已编译的模式(如果已经进行了编译),将不会再次重复(在我们的情况下,因为我们没有任何到期设置)。 现在一个简单的测试

GuavaCache.java

package pl.grzejszczak.marcin.guava.cache;import com.google.common.base.Stopwatch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pl.grzejszczak.marcin.guava.cache.utils.RegexpUtils;import java.util.regex.Pattern;import static java.lang.String.format;public class GuavaCache {private static final Logger LOGGER = LoggerFactory.getLogger(GuavaCache.class);public static final String STRING_TO_MATCH = "something";public static void main(String[] args) {runTestForManualCompilationAndOneUsingCache(1);runTestForManualCompilationAndOneUsingCache(10);runTestForManualCompilationAndOneUsingCache(100);runTestForManualCompilationAndOneUsingCache(1000);runTestForManualCompilationAndOneUsingCache(10000);runTestForManualCompilationAndOneUsingCache(100000);runTestForManualCompilationAndOneUsingCache(1000000);}private static void runTestForManualCompilationAndOneUsingCache(int firstNoOfRepetitions) {repeatManualCompilation(firstNoOfRepetitions);repeatCompilationWithCache(firstNoOfRepetitions);}private static void repeatManualCompilation(int noOfRepetitions) {Stopwatch stopwatch = new Stopwatch().start();compileAndMatchPatternManually(noOfRepetitions);LOGGER.debug(format("Time needed to compile and check regexp expression [%d] ms, no of iterations [%d]", stopwatch.elapsedMillis(), noOfRepetitions));}private static void repeatCompilationWithCache(int noOfRepetitions) {Stopwatch stopwatch = new Stopwatch().start();compileAndMatchPatternUsingCache(noOfRepetitions);LOGGER.debug(format("Time needed to compile and check regexp expression using Cache [%d] ms, no of iterations [%d]", stopwatch.elapsedMillis(), noOfRepetitions));}private static void compileAndMatchPatternManually(int limit) {for (int i = 0; i < limit; i++) {Pattern.compile("something").matcher(STRING_TO_MATCH).matches();Pattern.compile("something1").matcher(STRING_TO_MATCH).matches();Pattern.compile("something2").matcher(STRING_TO_MATCH).matches();Pattern.compile("something3").matcher(STRING_TO_MATCH).matches();Pattern.compile("something4").matcher(STRING_TO_MATCH).matches();Pattern.compile("something5").matcher(STRING_TO_MATCH).matches();Pattern.compile("something6").matcher(STRING_TO_MATCH).matches();Pattern.compile("something7").matcher(STRING_TO_MATCH).matches();Pattern.compile("something8").matcher(STRING_TO_MATCH).matches();Pattern.compile("something9").matcher(STRING_TO_MATCH).matches();}}private static void compileAndMatchPatternUsingCache(int limit) {for (int i = 0; i < limit; i++) {RegexpUtils.matches(STRING_TO_MATCH, "something");RegexpUtils.matches(STRING_TO_MATCH, "something1");RegexpUtils.matches(STRING_TO_MATCH, "something2");RegexpUtils.matches(STRING_TO_MATCH, "something3");RegexpUtils.matches(STRING_TO_MATCH, "something4");RegexpUtils.matches(STRING_TO_MATCH, "something5");RegexpUtils.matches(STRING_TO_MATCH, "something6");RegexpUtils.matches(STRING_TO_MATCH, "something7");RegexpUtils.matches(STRING_TO_MATCH, "something8");RegexpUtils.matches(STRING_TO_MATCH, "something9");}}}

我们正在运行一系列测试,并检查它们的执行时间。 请注意,由于应用程序不是独立运行的,因此这些测试的结果并不精确,因此许多条件都可能影响执行时间。 我们有兴趣显示一定程度的问题,而不是显示准确的执行时间。 对于给定的迭代次数(1,10,100,1000,10000,100000,1000000),我们要么编译10个正则表达式,要么使用Guava的缓存检索已编译的Pattern,然后将它们与要匹配的字符串进行匹配。 这些是日志:

pl.grzejszczak.marcin.guava.cache.GuavaCache:34 Time needed to compile and check regexp expression [1] ms, no of iterations [1]
pl.grzejszczak.marcin.guava.cache.GuavaCache:40 Time needed to compile and check regexp expression using Cache [35] ms, no of iterations [1]
pl.grzejszczak.marcin.guava.cache.GuavaCache:34 Time needed to compile and check regexp expression [1] ms, no of iterations [10]
pl.grzejszczak.marcin.guava.cache.GuavaCache:40 Time needed to compile and check regexp expression using Cache [0] ms, no of iterations [10]
pl.grzejszczak.marcin.guava.cache.GuavaCache:34 Time needed to compile and check regexp expression [8] ms, no of iterations [100]
pl.grzejszczak.marcin.guava.cache.GuavaCache:40 Time needed to compile and check regexp expression using Cache [3] ms, no of iterations [100]
pl.grzejszczak.marcin.guava.cache.GuavaCache:34 Time needed to compile and check regexp expression [10] ms, no of iterations [1000]
pl.grzejszczak.marcin.guava.cache.GuavaCache:40 Time needed to compile and check regexp expression using Cache [10] ms, no of iterations [1000]
pl.grzejszczak.marcin.guava.cache.GuavaCache:34 Time needed to compile and check regexp expression [83] ms, no of iterations [10000]
pl.grzejszczak.marcin.guava.cache.GuavaCache:40 Time needed to compile and check regexp expression using Cache [33] ms, no of iterations [10000]
pl.grzejszczak.marcin.guava.cache.GuavaCache:34 Time needed to compile and check regexp expression [800] ms, no of iterations [100000]
pl.grzejszczak.marcin.guava.cache.GuavaCache:40 Time needed to compile and check regexp expression using Cache [279] ms, no of iterations [100000]
pl.grzejszczak.marcin.guava.cache.GuavaCache:34 Time needed to compile and check regexp expression [7562] ms, no of iterations [1000000]
pl.grzejszczak.marcin.guava.cache.GuavaCache:40 Time needed to compile and check regexp expression using Cache [3067] ms, no of iterations [1000000]

您可以在Guava / Cache目录下的此处找到源,或转到URL https://bitbucket.org/gregorin1987/too-much-coding/src

参考:来自我们的JCG合作伙伴 Marcin Grzejszczak(位于Blog 上)的正则表达式模式的Google Guava Cache, 用于编码成瘾者博客。

翻译自: https://www.javacodegeeks.com/2013/04/google-guava-cache-with-regular-expression-patterns.html

正则表达式 guava

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

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

相关文章

word中一直提示校对错误,如何关闭当前文档校对功能

关闭当前文档校对功能 文件>选项>校对>例外项&#xff0c;选中两个&#xff0c;如图 对比效果&#xff1a;

微信小程序开发学习记录01

微信小程序结构 根目录 app.js&#xff1a;小程序逻辑文件&#xff08;必须&#xff09; app.json&#xff1a;小程序配置文件&#xff08;必须&#xff09; app.wxss&#xff1a;全局公共样式文件&#xff08;非必须&#xff09; pages 组成小程序的多个页面&#xff0c…

Java Optionals获得更具表现力的代码

我们中任何人使用允许空引用的语言进行编程时&#xff0c;都会遇到尝试取消引用一个引用时发生的情况。 无论是导致segfault还是NullPointerException&#xff0c;它始终是一个错误。 托尼霍尔将其描述为他十亿美元的错误 。 当函数向客户端的开发人员未预料到的客户端返回空引…

Atom使用方法(快捷键,插件,汉化)

Atom文本编辑软件 使用方法 常用快捷键 Ctrl Shift M &#xff1a;打开markdown调试窗口 Crtl m&#xff1a;相应括号之间&#xff0c;html tag之间等跳转 Crtl Alt B&#xff1a; 格式化代码&#xff08;需要安装atom-beautify&#xff09; Crtl &#xff1a;调起CLI…

将测微仪与Spring Boot 2一起使用

这是快速入门&#xff0c;介绍了如何使用出色的Micrometer库来检测基于Spring Boot 2的应用程序并在Prometheus中记录指标 介绍 Micrometer在各种监视工具提供的客户端库上提供了基于Java的外观。 以Prometheus为例&#xff0c;如果我要将Java应用程序与Prometheus集成&#…

学习笔记整理

毕设学习笔记整理说明Python和Pycharm使用方面因网络问题导致pycharm安装第三方库失败的解决办法将python程序打包为exe程序pyinstallerpy2exepycharm取消缩进Python函数方面python中 if __name__ __main__: 的作用与意义cv2.resize的用法只读取图像的单通道数值最值索引图像增…

与Maven的集成测试

用Maven实施单元测试是很普通的事情&#xff0c;我们大多数人都熟悉项目结构以及单元测试所在的位置。 但是&#xff0c;集成测试是一种不同的情况&#xff0c;大多数情况下它们具有完全不同的要求。 例如&#xff0c;可以让您的单元测试在内存数据库中的h2上运行&#xff0c;…

通信原理-通信系统的组成

第一章 通信系统的组成 1、通信系统一般模型 发送设备&#xff1a;将信源产生的原始电信号变换成适合在信道中传输的形式。变换方式有调制、放大、滤波、编码、多路复用等。 信道&#xff1a;传输信号的通道.即传输媒质。在给子信号通道的同时&#xff0c;信道也会对信号产生损…

使用log4j2免费分配日志记录

介绍 最近&#xff0c;我正在为一个客户端工作&#xff0c;试图为大型精心制作的Java系统消除一些GC暂停。 经过分析后&#xff0c;我意识到大部分垃圾都是通过日志记录产生的&#xff01; 是否有一种简单的方法来删除所有分配&#xff1f; 原来有:) 我应该使用哪个框架进行GC…

Verilog中fork...join 的用法

特点 中间的语句并行执行&#xff1b;&#xff08;延时不累加&#xff09; 不能用于综合&#xff1b; 代码 module signal_gen; reg wave; parameter cycle 5; initial beginforkwave 0;#(cycle) wave 1;#(2*cycle) wave 0;#(3*cycle) wave 1;#(4*cycle…

使用JWT的Cloud Native应用程序

本机云应用程序是为云计算环境开发的应用程序。 对于“ 什么是云原生应用程序 ”这个问题没有具体答案&#xff0c;但是必须满足不同的概念。 在我看来&#xff0c;最重要的功能之一就是能够快速缩放 。 这意味着我们的应用程序在每台服务器上都无法具有任何状态&#xff0c;…

stackexchange_通过Spring Social发推StackExchange问​​题

stackexchange1.简介 这是有关小型辅助项目的第三篇也是最后一篇文章-该机器人自动在专用帐户上发布来自各个Q&#xff06;A StackExchange网站上的问题的推文&#xff08;文章末尾的完整列表&#xff09;。 第一篇文章讨论了为StackExchange REST API构建简单的客户端 。 在第…

使用JCache缓存方法结果

在JCache中&#xff0c;有一个方便的功能可以透明地缓存方法的结果。 您可以使用CacheResult注释托管bean的方法&#xff0c;并且将再次返回第一次调用的结果&#xff0c;而无需再次调用实际方法。 import javax.cache.annotation.CacheResult; // ...public class Calculator…

开源项目GoodView点赞效果

点赞1效果&#xff1a; GoodView方法&#xff1a; 使用GoodView的Demo: public class MainActivity extends Activity { Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main)final Good…

开源RefreshListView下拉刷新效果

1、AnimationDrawable java.lang.Object ↳android.graphics.drawable.Drawable ↳android.graphics.drawable.DrawableContainer ↳android.graphics.drawable.AnimationDrawable 文档概述&#xff1a;An object used to create frame-by-frame animations, defined …

Neo4j:遍历查询超时

在过去的几周中&#xff0c;我一直在花一些业余时间来创建一个应用程序&#xff0c;该应用程序从Open Roads数据生成运行路线-当然已转换并导入到Neo4j中&#xff01; 我创建了一个用户定义的过程&#xff0c;该过程结合了几个最短路径查询&#xff0c;但是如果它们花费的时间…

View的三大流程之View的测量

1、public class View extends Objectimplements Drawable.Callback KeyEvent.Callback AccessibilityEventSourcejava.lang.Object ↳android.view.View Class Overview This class represents the basic building block for user interface components. A View occupies a …

使用LayoutParams设置布局

1、public static class ViewGroup.LayoutParams extends Objectjava.lang.Object ↳android.view.ViewGroup.LayoutParams Class Overview LayoutParams are used by views to tell their parents how they want to be laid out. LayoutParams是ViewGroup的一个内部类, 每个…

记录意外的开关选项

Java开发人员可以做很多事情来使自己的生活以及维护该代码的其他人的生活更加轻松。 在本文中&#xff0c;我将探讨开发人员可以采用的一种非常简单的方法&#xff0c;以使每个人都更轻松。 这篇文章的要点对于每个阅读它的人来说似乎都是显而易见的&#xff0c;但是我发现这样…

View的绘制

1、当测量好一个View后就可以重写onDraw()方法&#xff0c;并在Canvas对象上绘制所需的图形。 public class Canvas extends Objectjava.lang.Object ↳android.graphics.Canvas Public ConstructorsCanvas()Construct an empty raster canvas.Canvas(Bitmap bitmap)Construc…