我用多线程执行了
HttpResponse response = httpClient.execute(httpost);这个方法。
一般的时候执行这个方法大概耗时200毫秒。但是有些时候执行这个方法大概耗时20秒。耗时长的时候,一般是并发比较大的时候,感觉服务器响应不过来所以慢。我不知道怎么能提高这个效率啊。
我尝试增加了一些参数提高效率 client.getParams().setBooleanParameter("http.tcp.nodelay", true);
// this.httpClient.getParams()
// .setIntParameter("http.socket.timeout", 5000);
// this.httpClient.getParams().setIntParameter("http.connection.timeout",
// 5000);
// client.getParams()
// .setParameter("http.connection.stalecheck", false);
如上~~但很基本没有效果。。麻烦大侠帮忙看看啊。有什么思路或者怎么做可以提高效率。
难道需要修改httpClient的execute方法吗?

解决方案 »

  1.   

    这个跟client没关系吧
    看下你服务端吧。
    假如说你服务端1s只能处理200个请求,然后你不停的发请求,比如每秒多于200个,你的请求在服务端自然不停的积压,然后响应自然也就慢了,甚至超时。
    如果不改服务端,建议缩下线程数,或者每次请求让线程睡一下,或者维护一个池子,一旦发现响应过慢,则减少线程数,或者干脆等把积压的请求全部处理完了,在继续提交任务
      

  2.   


    我知道啊,但是为什么其他人就可以发更多的帖子呢?我认为他们设置了什么参数让服务器优先选择了他们,
    比如类似  client.getParams().setBooleanParameter("http.tcp.nodelay", true); 这样的参数啊
      

  3.   

    并发 并不一定 效率就高。并发编程最佳使用场景应该是CPU密集型运算。其他人的程序,相同时间内,做的事情比你多,并不一定就是因为人家并发量比你大。
    你要是想玩HTTP调用,就应该先把HTTP协议弄明白。
    当然,TCP的基础知识也应该了解一些,才能编写出高效的通信程序。至于在HTTP协议中,通过设置参数,让服务器优先响应某个客户端的请求,我觉得这只能是猜想。
    而且,以我的经验,一般的WEB服务端是没有这个功能的。
    还有,参数调优的事情,要放在最后做,而不是在开发的时候做。至于怎么解决效率的问题,我在5楼已经说了,就不啰嗦了。
      

  4.   

    楼主要考虑客户端的机子硬件配置,网络带宽。这些都会影响你的速度的,你可以尝试把代码放到别的性能不一样的机子上试试看效果是不是一样的。即使服务器能处理你的请求,如果你的客户端配置不给力也会导致反应慢。测试的时候留意客户端机子的cpu和网络方面的数据。
      

  5.   

    我生成了x个HttpClient,和x个HttpPost 然后用线程池执行
    private ThreadPoolExecutor threadPool = new ThreadPoolExecutor(20, 25,25,
    TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(20),
    new ThreadPoolExecutor.CallerRunsPolicy());
    for (int i=0;i<21;i++) {
    threadPool.execute(new ThreadPoolTask(HttpClientList.get(i), HttpPostList.get(i)));
    }[13 19:30:51.909]#Thread.Id:[28]#..........##Url耗时:470 .毫秒
    [13 19:30:55.569]#Thread.Id:[30]#..........##Url耗时:4080 .毫秒
    [13 19:30:55.569]#Thread.Id:[41]#..........##Url耗时:4070 .毫秒
    [13 19:30:55.569]#Thread.Id:[27]#..........##Url耗时:4140 .毫秒
    [13 19:30:55.679]#Thread.Id:[39]#..........##Url耗时:4180 .毫秒
    [13 19:30:55.899]#Thread.Id:[37]#..........##Url耗时:4400 .毫秒
    [13 19:30:59.129]#Thread.Id:[36]#..........##Url耗时:7610 .毫秒
    [13 19:30:59.139]#Thread.Id:[50]#..........##Url耗时:7640 .毫秒
    [13 19:30:59.139]#Thread.Id:[38]#..........##Url耗时:7640 .毫秒
    [13 19:30:59.359]#Thread.Id:[43]#..........##Url耗时:7860 .毫秒
    [13 19:31:02.709]#Thread.Id:[47]#..........##Url耗时:11210 .毫秒
    [13 19:31:02.709]#Thread.Id:[46]#..........##Url耗时:11210 .毫秒
    [13 19:31:02.719]#Thread.Id:[42]#..........##Url耗时:11220 .毫秒
    [13 19:31:02.909]#Thread.Id:[53]#..........##Url耗时:11410 .毫秒
    [13 19:31:06.229]#Thread.Id:[49]#..........##Url耗时:14730 .毫秒
    [13 19:31:06.239]#Thread.Id:[55]#..........##Url耗时:14740 .毫秒
    [13 19:31:06.289]#Thread.Id:[35]#..........##Url耗时:14790 .毫秒
    [13 19:31:06.439]#Thread.Id:[45]#..........##Url耗时:14940 .毫秒
    [13 19:31:09.769]#Thread.Id:[56]#..........##Url耗时:18240 .毫秒
    [13 19:31:09.769]#Thread.Id:[51]#..........##Url耗时:18270 .毫秒我发现执行效果大概是每4个一组,启动时间依此增加,每次差不多有5秒的间隔这个间隔太长了,我不知道是我哪里写错了。还是httpclient 和 HttpPost 有什么特性呢?