`

五种不同的 URL 参数解析方法的性能比较

url 
阅读更多

 

 

原文链接:http://blog.csdn.net/a491057947/article/details/20148783

因为在我们的项目中需要解析日志中的 URL 的参数,所以我对比了一下五种不同 的 URL 参数解析方法的性能。

URL 参数解析方法:

  1. httpclient org.apache.http.client.utils.URLEncodedUtils

    URLEncodedUtils.parse(query, Charset.forName("UTF-8"));
    
  2. jettyUtil org.eclipse.jetty.util.UrlEncoded

    MultiMap<String> values = new MultiMap<String>();  
    UrlEncoded.decodeTo(query, values, "UTF-8", 1000);
    
  3. tomcat org.apache.catalina.util.RequestUtil

    Map<String, String> values = new HashMap<String, String>();  
    RequestUtil.parseParameters(values, query, "UTF-8");
    
  4. 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);  
        }  
    }
    
  5. 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 来解析。

参考链接

  1. 本测试的代码 https://gist.github.com/hellojinjie/5651936
  2. Tomcat RequestUtil 的代码http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/RequestUtil.java?view=markup
  3. 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
  4. 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
分享到:
评论

相关推荐

    Url重写篇视频------本讲将通过实例比较ASP.NET下的三种典型URL重写方案

    本讲将通过实例比较ASP.NET下的三种典型URL重写方案——ISAPI重写(使用开源组件IIRF),ASP.NET2.0内置的urlMappings和基于自定义HTTPModule的URL重写(使用NBear.Web中的UrlRewriteModule实现),并探讨URL重写中...

    SQL查询安全性及性能优化

     解析:检验语句的出现的对象是否有效【进行一个解析,要检查对象所有权的权限】  优化:【检查SQL语句是否能够使用索引,SQL语句如何执行效率高,制定一个执行计划】  编译:  执行SQL语句:【把编译过的...

    java项目源码之UrlRewriter Java v2.0 RC1-urlrewriterjava.rar

    UrlRewriter Java v2.0 RC1 是一个基于 Java 的 URL 重写工具,旨在帮助开发人员实现灵活的 URL 重定向和重写功能。以下是该工具的主要实现描述: 核心功能实现: 使用 Java 编程语言实现了 URL 重写核心功能,...

    jquery插件使用方法大全

    第一个参数是异步请求的url,第二个为参数,第三个回调方法。 (4)的方法会在指定的Dom对象上绑定响应ajax执行的事件。 (5)同步加载数据。发送请求时锁住浏览器。需要锁定用户交互操作时使用同步方式。 var ...

    非阻塞式服务器Web.Java.zip

    这样在ArticleHandler中对应的get或者post方法中就会获取相应的参数。当然,你可以任意的使用正则表达式来配置你的URL 简单易用的数据库操作 Options.DBURL = "jdbc:mysql://localhost:3306/test"; Options....

    超级有影响力霸气的Java面试题大全文档

    如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 18、error和exception有什么区别?  error 表示恢复...

    java 面试题 总结

    如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 15、error和exception有什么区别? error 表示恢复不是...

    jdbc连接数据库的方式2

    为了获得更好的性能,可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能,如下所示:  conn.setAutoCommit(false);  值得注意的是,一旦关闭了自动提交功能,我们就需要通过调用...

    java面试题

    35. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 18 36. swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?...

    asp.net知识库

    按键跳转以及按Enter以不同参数提交,及其他感应事件 动态控制Page页的Head信息 SubmitOncePage:解决刷新页面造成的数据重复提交问题 SharpRewriter:javascript + xml技术利用#实现url重定向 采用XHTML和CSS设计可...

    net学习笔记及其他代码应用

    参数或参数类型不同,进行多次重载以适应不同的需要 Override 是进行基类中函数的重写。为了适应需要。 6.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法...

    ASP.NET MVC 3高级编程

    9.2.6 段中的多个url参数 221 9.2.7 stoproutinghandler和ignoreroute 222 9.2.8 路由的调试 223 9.2.9 揭秘路由如何生成url 224 9.3 揭秘路由如何绑定到操作 230 9.3.1 高层次请求的路由管道 230 9.3.2 路由...

    SSO CAS 单点登录实例SSOAuth+SSOWebDemo1+SSOWebDemo2.zip

    如 果举例说国内一著名的IT公司(名字隐去),内部共有60多个业务系统,这些系统包括两个不同版本的SAP的ERP系统,12个不同类型和版本的数据库系 统,8个不同类型和版本的操作系统,以及使用了3种不同的防火墙技术,...

    比较全面的:Jakarta-commons jar包(附: chm参考手册 & 资源简介)

    commons-cli 命令行参数解析 , 由 Werken, Avalon 和 Optz 组成 commons-codec 包含一些通用的编码解码算法。包括一些语音编码器, Hex, Base64, 以及URL encoder. commons-collections 扩充了 java.util....

    Clever_Internet_Suite_v_9.2.0.0

    国际域名(IDN)支持被添加到URL解析器中,过时的WinInet函数被新代码替换。 CertificateStore - 添加了为给定证书加载证书链的功能。 HTTP PATCH命令已实现。 SoapMessage - 改进了消息签名和验证性能。...

    FlashFXP(免注册)

    • 比较文件夹内容功能现在不选择 "上层目录" • 基于用户崩溃报告提交的错误修正许多问题并加以改进 FlashFXP v3.8 BETA - (3.7.5 build 1303) • 修改了几处崩溃报告提交系统和对话框 • 修正了通过 SFTP 下载时...

    asp.net面试题

    拆箱相反,重载就是指一个方法名同,参数个数不同,返回值可以相同的方法.CLR是通用语言运行时,其它的不清楚. 4.列举一下你所了解的XML技术及其应用 答:XML可是好东西,保存配置,站与站之间的交流,WEB SERVICE都要用它...

    ProcessWire-AIOM-All-In-One-Minify:AIOM +(多合一缩小)是一个ProcessWire模块,可以轻松地改善网站的性能。 通过简单的函数调用样式表,可以将LESS和Javascript文件解析,最小化并合并为一个文件。 这减少了服务器请求,缩短了加载时间,并最大程度地减少了流量。 此外,可以将生成HTML源代码最小化,并且可以在无cookie的域上加载所有生成的文件(域分片)-one source code

    AIOM +(多合一缩小)是一个ProcessWire模块,可以轻松地改善网站的性能。 通过简单的函数调用样式表,可以将LESS和Javascript文件解析,最小化并合并为一个文件。 这减少了服务器请求,缩短了加载时间,并最大程度...

    apache-commons源码及jar文件

    CLI 提供针对命令行参数,选项,选项组,强制选项等的简单API. Codec Codec 包含一些通用的编码解码算法。包括一些语音编码器, Hex, Base64, 以及URL encoder. Collections Commons-Collections 提供一个类包来...

Global site tag (gtag.js) - Google Analytics