由于在最近项目中须要解析日志中的 URL 的参数,因此我对比了一下五种不一样 的 URL 参数解析方法的性能。 URL 参数解析方法: httpclient org.apache.http.client.utils.URLEncodedUtils URLEncodedUtils.parse(query, Charset.forName("UTF-8")); jettyUtil org.eclipse.jetty.util.UrlEncoded MultiMap values = new MultiMap(); UrlEncoded.decodeTo(query, values, "UTF-8", 1000); tomcat org.apache.catalina.util.RequestUtil Map values = new HashMap(); RequestUtil.parseParameters(values, query, "UTF-8"); regex 正则表达式 String u = URLDecoder.decode(url, "UTF-8"); for (String s : parameters) { Pattern p = Pattern.compile(s + "=([^&]*)(&|$)"); Matcher m = p.matcher(u); if (m.find()) { m.group(1); } } split 使用String 的split 方法对 URL 进行分割,而后用equals 匹配对应的 参数 String u = URLDecoder.decode(url, "UTF-8"); for (String s : parameters) { String[] a = new String[100]; if (u.indexOf(s) != -1) { a = (u.substring(u.indexOf(s))).split("&"); a[0].split("="); } } 前三者是 httpclient, jetty, tomcat 使用的 URL 解析工具。Split 方法是最简单 也是最直观的解析方法,regex 则使用了正则表达式去匹配参数。 性能比较 用这五种方法分别解析同一个URL 100000遍,获得以下的数据。考虑到 Java 的代 码缓存特性,共运行4遍这样的测试,测试数据取最后一次的结果。 ---first--- httpclient: 3063 jettyUtil: 1767 tomcat: 2405 regex: 9226 split: 22905 ---second--- httpclient: 2766 jettyUtil: 1618 tomcat: 2229 regex: 9025 split: 23661 ---third--- httpclient: 2799 jettyUtil: 1632 tomcat: 2251 regex: 8761 split: 23476 ---fouth--- httpclient: 2989 jettyUtil: 1634 tomcat: 2251 regex: 8895 split: 23571 在最后一组数据中,咱们能够看到 jettyUtil 的性能最高,split 和 regex 的方法性 能较差。 总结 jettyUtil 解析URL的性能在五种中最高,若是咱们在项目中须要解析 URL ,应该 尽量的考虑使用 jettyUtil 来解析。 参考连接 本测试的代码 https://gist.github.com/hellojinjie/5651936 Tomcat RequestUtil 的代码http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/RequestUtil.java?view=markup jettyUtil UrlEncoded 的代码 http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/jetty-util/src/main/java/org/eclipse/jetty/util/UrlEncoded.java httpclient URLEncodedUtils 的代码 https://svn.apache.org/repos/asf/httpcomponents/httpclient/tags/4.0-beta1/module-client/src/main/java/org/apache/http/client/utils/URLEncodedUtils.java 来源:Heck's Blog 地址:http://www.hecks.tk/post/433/ 转载时须以连接形式注明做者和原始出处及本声明,不然将追究法律责任,谢谢配合!