gpt4 book ai didi

java - 正则表达式中的性能问题

转载 作者:行者123 更新时间:2023-12-03 17:07:19 25 4
gpt4 key购买 nike

我的 REST 服务在高负载下运行,这意味着它每天会收到大约数百万次读取调用的大量流量。我的 REST servcie 将根据用户 ID 从数据库中查找并检索与该用户 ID 对应的几列。

所以我目前在我的代码中发现了高性能问题。我怀疑下面的方法将是我应该首先开始优化的方法之一。

下面的方法将接受一个 attributeName,然后根据它使用正则表达式给我匹配。

让我们举个例子——如果 attrNametechnology.profile.financial

然后下面的方法将作为 technology.profile 返回给我。这样它也适用于其他情况。

private String getAttrDomain(String attrName){
Pattern r = Pattern.compile(CommonConstants.VALID_DOMAIN);
Matcher m = r.matcher(attrName.toLowerCase());
if (m.find()) {
return m.group(0);
}
return null;
}

CommonConstants类文件中

String  VALID_DOMAIN = "(technology|computer|sdc|adj|wdc|pp|stub).(profile|preference|experience|behavioral)";

我只是想看看,使用上面的正则表达式是否存在性能问题?如果是,那么在考虑性能问题的情况下再次重写这个东西的最佳方法是什么?

感谢您的帮助。

最佳答案

我使用 caliper 测试了这个和这个,结果是:如果您在每个方法调用之前编译模式,这将是最快的方法。

你的正则表达式方法是最快的方法,但是你唯一需要做的改变就是预先计算模式,而不是每次:

 private static Pattern p = Pattern.compile(VALID_DOMAIN);

然后在你的方法中:

 Matcher matcher = pattern.matcher(input); ...

对于感兴趣的人,这是我用于卡尺的设置:--warmupMillis 10000 --runMillis 100

 package stackoverflow;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.google.caliper.Param;
import com.google.caliper.Runner;
import com.google.caliper.SimpleBenchmark;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;

public class RegexPerformance extends SimpleBenchmark {
private static final String firstPart = "technology|computer|sdc|adj|wdc|pp|stub";
private static final String secondPart = "profile|preference|experience|behavioral";
private static final String VALID_DOMAIN = "(technology|computer|sdc|adj|wdc|pp|stub)\\.(profile|preference|experience|behavioral)";

@Param({"technology.profile.financial", "computer.preference.test","sdc.experience.test"})
private String input;

public static void main(String[] args) {
Runner.main(RegexPerformance.class, args);
}

public void timeRegexMatch(int reps){
for(int i=0;i<reps;++i){
regexMatch(input);
}
}


public void timeGuavaMatch(int reps){
for(int i=0;i<reps;++i){
guavaMatch(input);
}
}

public void timeRegexMatchOutsideMethod(int reps){
for(int i=0;i<reps;++i){
regexMatchOutsideMethod(input);
}
}


public String regexMatch(String input){
Pattern p = Pattern.compile(VALID_DOMAIN);
Matcher m = p.matcher(input);
if(m.find()) return m.group();
return null;
}

public String regexMatchOutsideMethod(String input){
Matcher matcher = pattern.matcher(input);
if(matcher.find()) return matcher.group();
return null;
}

public String guavaMatch(String input){
Iterable<String> tokens = Splitter.on(".").omitEmptyStrings().split(input);
String firstToken = Iterables.get(tokens, 0);
String secondToken = Iterables.get(tokens, 1);
if( (firstPart.contains(firstToken) ) && (secondPart.contains(secondToken)) ){
return firstToken+"."+secondToken;
}
return null;
}
}

以及测试结果:

             RegexMatch technology.profile.financial 2980 ========================
RegexMatch computer.preference.test 2861 =======================
RegexMatch sdc.experience.test 3683 ==============================
RegexMatchOutsideMethod technology.profile.financial 179 =
RegexMatchOutsideMethod computer.preference.test 227 =
RegexMatchOutsideMethod sdc.experience.test 987 ========
GuavaMatch technology.profile.financial 406 ===
GuavaMatch computer.preference.test 421 ===
GuavaMatch sdc.experience.test 382 ===

关于java - 正则表达式中的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16118131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com