我们有一个应用程序,我们需要过滤某些类型的文件。我们认为正则表达式比简单Strings.endsWith()
方法更快。但为了验证这个假设,我们做了一个小的基准测试。以下是我们使用的工作代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test{
private static Pattern pattern;
private static Matcher matcher;
private static final String IMAGE_PATTERN = "([^\\s]+(\\.(?i)(jpeg|jpg|png|gif|bmp|css|js))$)";
private static String[] files = {"jpeg","jpg","png","gif","bmp","css","js"};
public static void main(String args[]) throws Exception {
pattern = Pattern.compile(IMAGE_PATTERN);
//Input Strings
String input = args[0];
String[] inputArr = input.split(",");
Integer iterations = 10000;
Integer i = 0;
Long t1 = System.currentTimeMillis();
while(i < iterations){
for (int j = 0; j < inputArr.length; j++) {
validateReg(inputArr[j]);
}
i++;
}
System.out.println("Time taken using regex:"+(System.currentTimeMillis() - t1));
t1 = System.currentTimeMillis();
i=0;
while(i < iterations){
for (int j = 0; j < inputArr.length; j++) {
validateStr(inputArr[j]);
}
i++;
}
System.out.println("Time taken using .endsWith :"+(System.currentTimeMillis() - t1));
}
public static boolean validateReg(final String file){
matcher = pattern.matcher(file);
return matcher.matches();
}
public static boolean validateStr(final String file){
for (int i = 0; i < files.length; i++) {
if(file.endsWith(files[i])){
return true;
}
}
return false;
}
}
输入abc.jpg,efg.css,jij.jpeg,test.java,best.css,not.gif,f.exe,test.js,su.css,not.js,yes,png
打印:
Time taken using regex:89
Time taken using .endsWith :6
并且多次运行的数字相同。即使更改while循环的执行顺序,结果也相同。似乎String.endsWith()比其正则表达式更快。
现在我的问题是:,这个基准测试方法是否正确得出结论?或者有更好,更可靠的方法来测试这种情况吗?
答案 0 :(得分:1)
我发现endsWith
更快正常。我怀疑是否需要进行大量测试才能得出结论。
普通字符串搜索方法通常比正则表达式更快(不仅仅是在Java中)。
答案 1 :(得分:0)
String.endsWith
只需比较比较字符串末尾的字节(字符)即可。另一方面,Regexp需要更多时间来解析regexp,编译它,构建匹配器并执行它。但至于你的问题:这个测试大致可以,至少可以显示regexp和endsWith之间的差异。在更精确的测量中,您应该尽可能晚地选择开始时间戳,可能会尽快排除循环开销和结束时间戳,然后执行一些计算(求和周期)。例如:
long t0, t1, tt = 0L;
for (int i = 0; i < ITERATIONS; i++) {
t0 = System.currentTimeMillis();
//- Execute the code its execution time you want to measure here.
t1 = System.currentTimeMillis();
tt += (t1 - t0);
}
System.out.println("Total time: " + tt + "ms");
要获得更精确的测量结果,您可以使用System.nanoTime()
。