<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/post//</link>
<title><![CDATA[五种URL参数解析方法的性能比较]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[Web开发]]></category>
<pubDate>Sat, 11 Apr 2015 02:30:40 +0000</pubDate> 
<guid>https://www.heckjj.com/post//</guid> 
<description>
<![CDATA[ 
	因为在最近项目中需要解析日志中的 URL 的参数，所以我对比了一下五种不同 的 URL 参数解析方法的性能。<br/>URL 参数解析方法:<br/><br/>httpclient org.apache.http.client.utils.URLEncodedUtils<br/><br/>URLEncodedUtils.parse(query, Charset.forName("UTF-8"));<br/>jettyUtil org.eclipse.jetty.util.UrlEncoded<br/><br/>MultiMap<String> values = new MultiMap<String>();&nbsp;&nbsp;<br/>UrlEncoded.decodeTo(query, values, "UTF-8", 1000);<br/>tomcat org.apache.catalina.util.RequestUtil<br/><br/>Map<String, String> values = new HashMap<String, String>();&nbsp;&nbsp;<br/>RequestUtil.parseParameters(values, query, "UTF-8");<br/>regex 正则表达式<br/><br/>String u = URLDecoder.decode(url, "UTF-8");&nbsp;&nbsp;<br/>for (String s : parameters) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Pattern p = Pattern.compile(s + "=([^&]*)(&&#124;$)");&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Matcher m = p.matcher(u);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (m.find()) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.group(1);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&#125;<br/>split 使用String 的split 方法对 URL 进行分割，然后用equals 匹配对应的 参数<br/><br/>String u = URLDecoder.decode(url, "UTF-8");&nbsp;&nbsp;<br/>for (String s : parameters) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;String[] a = new String[100];&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (u.indexOf(s) != -1) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a = (u.substring(u.indexOf(s))).split("&");&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[0].split("=");&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp; <br/>前三者是 httpclient, jetty, tomcat 使用的 URL 解析工具。Split 方法是最简单 也是最直观的解析方法，regex 则使用了正则表达式去匹配参数。<br/><br/>性能比较<br/><br/>用这五种方法分别解析同一个URL 100000遍，得到如下的数据。考虑到 Java 的代 码缓存特性，共运行4遍这样的测试，测试数据取最后一次的结果。<br/><br/>---first---<br/>httpclient: 3063<br/>jettyUtil: 1767<br/>tomcat: 2405<br/>regex: 9226<br/>split: 22905<br/>---second---<br/>httpclient: 2766<br/>jettyUtil: 1618<br/>tomcat: 2229<br/>regex: 9025<br/>split: 23661<br/>---third---<br/>httpclient: 2799<br/>jettyUtil: 1632<br/>tomcat: 2251<br/>regex: 8761<br/>split: 23476<br/>---fouth---<br/>httpclient: 2989<br/>jettyUtil: 1634<br/>tomcat: 2251<br/>regex: 8895<br/>split: 23571 <br/>在最后一组数据中，我们可以看到 jettyUtil 的性能最高，split 和 regex 的方法性 能较差。<br/><br/>总结<br/><br/>jettyUtil 解析URL的性能在五种中最高，如果我们在项目中需要解析 URL ，应该 尽可能的考虑使用 jettyUtil 来解析。<br/><br/>参考链接<br/><br/>本测试的代码 https://gist.github.com/hellojinjie/5651936<br/>Tomcat RequestUtil 的代码http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/RequestUtil.java?view=markup<br/>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<br/>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<br/>Tags - <a href="https://www.heckjj.com/tags/url%25E5%258F%2582%25E6%2595%25B0%25E8%25A7%25A3%25E6%259E%2590/" rel="tag">url参数解析</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post//#blogcomment</link>
<title><![CDATA[[评论] 五种URL参数解析方法的性能比较]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>