hc-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sam Berlin <sber...@limepeer.com>
Subject Re: question about performance
Date Thu, 08 Apr 2004 19:29:10 GMT
Regarding point 4, it might be worthwhile to use reflection on newer 
JVMs so that the controller thread isn't necessary.  An example of this 
is:

             //a) Conceptually, this code does the following:
             //      SocketAddress addr=new InetSocketAddress(host, 
port);
             //      Socket ret=new Socket();
             //      ret.connect(addr, timeout);
             //      return ret;
             //   Unfortunately that causes compile errors on older 
versions
             //   of Java.  Worse, it may cause runtime errors if class 
loading
             //   is not done lazily.  (See chapter 12.3.4 of the Java 
Language
             //   Specification.)  So we use reflection.
      		Class _socketClass = Class.forName("java.net.Socket");
			Class _socketAddressClass = Class.forName("java.net.SocketAddress");
      		Class _connectMethod = _socketClass.getMethod("connect",
                     new Class[] { _socketAddressClass, Integer.TYPE });
			Class socketAddress =
				Class.forName("java.net.InetSocketAddress");
			Class _inetAddressConstructor =
				socketAddress.getConstructor(new Class[] {
					String.class, Integer.TYPE
				});
             try {
                 Socket ret = (Socket)_socketClass.newInstance();

				Object addr = _inetAddressConstructor.newInstance(
                     new Object[] { host, new Integer(port) });

                 _connectMethod.invoke(ret,
                     new Object[] { addr, new Integer(timeout) });
                 return ret;
             } catch (InvocationTargetException e) {
                 Throwable e2 = e.getTargetException();
                 throw (IOException)e2;
             } catch(InstantiationException e) {
             } catch(IllegalAccessException e) {
             }

Thanks,
  Sam


On Thursday, April 8, 2004, at 03:22  PM, Oleg Kalnichevski wrote:

> Gil,
> (1) First and foremost DO reuse HttpClient instances when using
> multi-threaded connection manager. HttpClient class is thread-safe. In
> fact there are no known problems with having just one instance of
> HttpClient per application. Using a new instance of HttpClient for
> processing each request totally defeats all the performance
> optimizations we have built into HttpClient
>
> (2) Use multi-threaded connection manager in case you do not
>
> (3) Disable stale connection check
>
> (4) Do not use connect timeout which causes a controller thread to be
> spawned per connection attempt
>
> Oleg
>
> On Thu, 2004-04-08 at 21:02, Alvarez, Gil wrote:
>> We recently ported our url-hitting code from using java.net.* code to
>> httpclient code. We use it in a high-volume environment (20 machines 
>> are
>> hitting an external 3rd party to retrieve images).
>>
>>
>>
>>
>>
>> After the port, we saw a significant increase in cycles used by the
>> machines, about 2-3 times (ie, the load on the boxes increased from
>> using up 20% of the cpu, to about 50%-60% of the cpu.
>>
>>
>>
>> For each request, we instantiate an HttpClient object, and a GetMethod
>> object, and shut things down afterwards.
>>
>>
>>
>> In order to reduce the use of cycles, what is the recommended 
>> approach?
>>
>>
>>
>> Thank you.
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: 
> commons-httpclient-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: 
> commons-httpclient-dev-help@jakarta.apache.org
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message