`

HttpClient3和HttpClient4性能比较

阅读更多

把这个帖子作为日记,记下来,如果title带有为什么,Javaeye会自动把它移到问答频道,重新输入一下,看看高手们的反应:

 

最近为了查一个问题,分别使用HttpClient3和HttpClient4发一个同样post请求到同一个server上,发现 HttpClient3比HttpClient4性能要好很多,测试结果是H3,平均时间是800ms,而httpClient4要3秒钟,代码如下:

 

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.httpclient.DefaultMethodRetryHandler;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

 

/*

* @author Tomy Zhou
 * @since 1.0
 * @version ; HttpClientTest.java 2010-7-6
 **/
public class HttpClientTest {

    public static void main(String[] args) throws Exception {

        /***************************************
         *
         * Method1
         *
         * Using HttpClient3
         *
         *
         *
         *
         */
        long startTime = System.currentTimeMillis();
        NameValuePair[] postData = new NameValuePair[1];
        postData[0] = new NameValuePair("hl", "zh-CN");

        PostMethod post = new PostMethod("http://www.google.com.hk/search");

        HttpClient client = new HttpClient();

        int httpStatusCode = -1;
        InputStream in = null;
        // Set RetryHandler
        DefaultMethodRetryHandler retryhandler = new DefaultMethodRetryHandler();
        retryhandler.setRequestSentRetryEnabled(true);
        retryhandler.setRetryCount(3);
        post.setMethodRetryHandler(retryhandler);
        // Set Post Data
        post.setRequestBody(postData);
        BufferedReader ins = null;
        String loginResult = null;
        // Execute Post Request
        try {
            // (client.getHttpConnectionManager()).closeIdleConnections(0);
            httpStatusCode = client.executeMethod(post);
            in = post.getResponseBodyAsStream();
            ins = new BufferedReader(new InputStreamReader(in, "ISO-8859-1"));
            String line = null;
            StringBuffer outbuffer = new StringBuffer();
            while ((line = ins.readLine()) != null) {
                outbuffer.append(line);
            }
            loginResult = outbuffer.toString();
            System.out.println(loginResult);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                in.close();
            }
            if (ins != null) {
                ins.close();
            }
            if (post != null) {
                post.releaseConnection();
                // (client.getHttpConnectionManager()).closeIdleConnections(0);
            }
        }
        System.out.println("The httpClient3 duration is ======"
                + (System.currentTimeMillis() - startTime));
        /*******************************************************************
         *
         *
         *Using HttpClient4 method1 to test
         *
         *
         */
        startTime = System.currentTimeMillis();
        DefaultHttpClient httpclient = new DefaultHttpClient();

        // 目标地址
        HttpPost httppost = new HttpPost("http://www.google.com.hk/search");
        // 构造最简单的字符串数据
        StringEntity reqEntity = new StringEntity("hl=zh-CN");

        // 设置请求的数据
        httppost.setEntity(reqEntity);
        // 执行
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        System.out.println("----------------------------------------");

        // 显示结果
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(entity
                    .getContent(), "UTF-8"));
            String line = null;
            StringBuffer outbuffer = new StringBuffer();
            while ((line = reader.readLine()) != null) {
                outbuffer.append(line);
            }
            System.out.println(outbuffer);
        } finally {
            if (reader != null) {
                reader.close();
            }
        }
        httpclient.getConnectionManager().shutdown();
        System.out.println("The httpClient4 duration is ======"
                + (System.currentTimeMillis() - startTime));
        Thread.sleep(10000);

        /*******************************************************************
         *
         *
         *Using HttpClient4 method2 to test
         *
         *
         */
        startTime = System.currentTimeMillis();
        // 3.Use HttpClient4 - 2
        DefaultHttpClient httpclient2 = new DefaultHttpClient();

        // 目标地址
        HttpPost httppost2 = new HttpPost("http://www.google.com.hk/search");
        // 构造最简单的字符串数据
        List<org.apache.http.NameValuePair> formParams = new ArrayList<org.apache.http.NameValuePair>();
        formParams.add(new BasicNameValuePair("hl", "zh-CN"));
        HttpEntity entityForm = new UrlEncodedFormEntity(formParams, "UTF-8");

        // 设置请求的数据
        httppost2.setEntity(entityForm);
        // 执行
        HttpResponse response2 = httpclient2.execute(httppost);
        HttpEntity entity2 = response2.getEntity();
        System.out.println("----------------------------------------");

        // 显示结果
        BufferedReader reader2 = new BufferedReader(new InputStreamReader(
                entity2.getContent(), "UTF-8"));
        String line2 = null;
        StringBuffer outbuffer2 = new StringBuffer();
        while ((line2 = reader2.readLine()) != null) {
            outbuffer2.append(line2);
        }
        System.out.println(outbuffer2);
        httpclient2.getConnectionManager().shutdown();
        System.out.println("The httpClient4-2 duration is ======"
                + (System.currentTimeMillis() - startTime));

    }

}

 

请大家赐教,什么原因造成这么大的差别。

分享到:
评论

相关推荐

    HttpClient 3.x to HttpComponents HttpClient 4.x

    例如,在HttpClient 3.x中,代码可能会使用`***mons.httpclient.HttpClient`类和`***mons.httpclient.methods.GetMethod`等,而在4.x版本中,这些都被新的API所替代。程序员需要熟悉`org.apache....

    httpclient4中文API和使用

    HttpClient 4.5是其一个稳定版本,提供了许多增强的功能和性能优化。本文将深入探讨HttpClient 4.5的中文API和使用方法。 首先,`httpclient4中文API.pdf`是HttpClient 4.5的中文版API文档,是学习和使用HttpClient...

    httpclient4

    HttpClient 4.0.1是该系列的一个版本,它在前一版本的基础上进行了优化和增强,旨在提高性能、稳定性和易用性。在本文中,我们将深入探讨HttpClient 4的关键特性、使用方法以及常见应用场景。 1. **基本概念** - *...

    httpClient4 最新帮助文档

    HttpClient 4的最新帮助文档会详细讲解这些知识点,并可能包含示例代码和故障排查指南,帮助开发者更好地理解和使用这个强大的HTTP客户端库。通过深入学习和实践,可以有效地处理各种HTTP通信需求。

    httpClient4.3.6包和实例

    4. **HTTP连接管理(Connection Management)**:HttpClient通过`HttpClientConnectionManager`来管理连接池,控制TCP连接的创建、复用和关闭,提高性能。 5. **请求和响应的配置**:可以通过`RequestConfig`来设置...

    apache httpclient 源码和 jar包

    3. **性能优化**:HttpClient允许我们自定义连接池大小、超时时间等参数,以优化性能。了解jar包中的配置选项,可以帮助我们根据实际需求调整HttpClient的性能。 总结来说,Apache HttpClient的源码和jar包为我们...

    httpClient4jar包

    HttpClient 4.x版本相较于早期的3.x版本进行了许多改进,包括性能优化、API简化和错误处理的强化。在描述中提到的“httpclient4”,指的是HttpClient 4.x系列,这是一个稳定且广泛使用的版本。 在HttpClient 4.4.1....

    httpClient和URLConnection的区别

    在Android应用开发中,进行网络通信是常见的任务,其中两种主要的请求方式是使用`HttpURLConnection`和`HttpClient`。虽然两者都能实现HTTP通信,但它们在功能、使用方式和性能上存在一些区别。 首先,Apache ...

    httpclient.jar4.4及4.5版本和httpcore.jar和commons-logging.jar.rar

    HTTPClient 4.4和4.5之间的主要差异可能在于错误修复、性能优化和新功能的添加。 HTTPCore是HTTPClient的核心组件,它提供了基本的HTTP协议处理功能,如TCP连接管理、HTTP消息解析和编码等。这个库的设计目的是为了...

    commons-httpclient-3.0-rc4.rar

    2. **连接池管理**:通过HttpConnectionManager,可以管理连接池,提高性能和效率。 3. **HTTPS支持**:HttpClient支持SSL/TLS,可以安全地处理HTTPS连接。 4. **代理设置**:配置HttpClient可以使用HTTP代理或SOCKS...

    httpclient.jar包下载

    4. **重试和恢复策略**:HttpClient内置了重试和恢复策略,当网络出现问题时,可以自动进行重试,保证请求的可靠性。 5. **异步和同步模式**:HttpClient提供同步和异步两种操作模式,适应不同场景的需求。 提到...

    httpclient4.3 和 httpcore4.4

    HttpClient 4.3是一个重大的更新,它引入了诸多增强功能和性能优化。首先,HttpClient 4.3支持了HTTP/1.1和HTTP/2协议,使开发者可以利用HTTP/2的多路复用(multiplexing)特性,提高并发请求的效率,减少网络延迟。...

    httpclient和httpcore的jar包

    3. **连接管理**:HttpClient提供了PoolingHttpClientConnectionManager,可以管理HTTP连接的生命周期,复用已建立的连接,提高性能。 4. **身份验证和安全**:HttpClient支持多种认证机制,如Basic Auth、Digest ...

    httpclient4源码

    本文将基于`httpclient4`源码,深入解析其核心概念和实现原理。 1. **连接管理**: HTTPClient4中的连接管理是通过`HttpClientConnectionManager`接口实现的,主要负责创建、复用和关闭TCP连接。`...

    httpclient4.4.1 and httpclient4.5.3.rar

    HttpClient 4.5.3是4.x系列的一个重要升级,它引入了更多新功能和改进,进一步增强了HttpClient的稳定性和可扩展性: - **HTTP/2支持**:HttpClient 4.5.3引入了对HTTP/2协议的支持,这是一个重要的进步,因为它...

    HttpClient for android 4 3 5 jar

    总之,HttpClient 4.3.5是一个强大的HTTP客户端库,它提供了丰富的功能和良好的性能,尽管在新版本的Android中已不推荐使用,但对于支持旧版本Android的应用或者对性能有较高要求的项目,HttpClient仍然是一种可靠的...

    httpClient需要的jar包

    4. **实体处理**:HttpClient支持对请求和响应中的实体进行编码和解码,如表单数据、JSON、XML等。EntityUtils类提供了读取和解析响应实体内容的方法。 5. **重试和恢复策略**:HttpClient可以通过设置RetryHandler...

    HttpClientUtil工具类发送get和post请求,支持http和https,支持发送文件

    3. 支持http和https:HttpClientUtil需要能够处理HTTP和HTTPS协议。HTTP协议不涉及数据加密,而HTTPS协议在HTTP的基础上加入了SSL/TLS层,提供数据加密和服务器身份验证,确保通信安全。HttpClient支持SSL/TLS,只需...

    httpclient

    可以通过设置连接超时、读写超时、最大连接数、连接复用策略等来优化HttpClient的性能。 10. **异步操作**: HttpClient也支持异步操作,通过`HttpAsyncClient`类,可以在回调函数中处理响应,适合于高并发场景。...

Global site tag (gtag.js) - Google Analytics