Hi Oleg,

Forgot to mention:

It's not that BufferedInputStream#reset is better or faster than
PushbackInputStream#unread. The BufferedInputStream merely supports
mark/reset as a side-effect of doing buffering. The PushbackInputStream
doesn't buffer. From HttpParser:

    public static byte[] readRawLine(InputStream inputStream) throws
IOException {
        ByteArrayOutputStream buf = new ByteArrayOutputStream(64);
        int ch;
        while ((ch = inputStream.read()) >= 0) {
            buf.write(ch);
            if (ch == '\n') {
                break;
            }
        }
        if (buf.size() == 0) {
            return null;
        }
        return buf.toByteArray();
    }

With PushbackInputStream every call to read will result in a JNI call
in the underlying SocketInputStream. With BufferedInputStream the socket
data is sucked in in 2K blocks thus vastly reducing the amount of JNI
we're doing.

Thanks,
Bjarne.

>>> [EMAIL PROTECTED] 9/1/2004 1:30:13 PM >>>
Bjarne,

Could you define 'considerably' in some ANSI units? ;-)

I have just recently dealt with this problem. The empirical data that
I
got appears to suggest that there's a (more or less) constant delta in
performance of ~2-3ms, which only makes a difference for relatively
small payloads. For more or less real-life scenarios HttpClient should
be at least as fast or faster than HttpUrlConnection 

http://marc.theaimsgroup.com/?l=httpclient-commons-dev&m=109300858528261&w=2


I'll re-run the tests to see if this change does result in noticeable
performance gains and poke around the Java source code to see if
there's
indeed a reason for PushbackInputStream#unread to be slower than
BufferedInputStream#reset

Thanks

Oleg



On Wed, 2004-09-01 at 18:27, Bjarne Rasmussen wrote:
> We found a small performance discrepancy between Java's
> HttpURLConnection and HttpClient. Disabling stale connection checks
> helps but HttpURLConnection is still faster for small payloads.
Making
> the following change to HttpConnection.java (line 689 in version
2.0.1)
> speeds things up considerably:
> 
>    inputStream = new BufferedInputStream(socket.getInputStream());
> 
> The BufferedInputStream's mark/reset methods can be used in place of
> PushbackInputStream.unread, e.g.:
> 
>     this.socket.setSoTimeout(timeout);
>     inputStream.mark(1);
>     int byteRead = inputStream.read();
>     if (byteRead != -1) {
>        inputStream.reset();
>        LOG.debug("Input data available");
>        result = true;
>     } else {
>        LOG.debug("Input data not available");
>     }
> 
> Thanks,
> Bjarne.
> 
> 
>
---------------------------------------------------------------------
> To unsubscribe, e-mail:
[EMAIL PROTECTED] 
> For additional commands, e-mail:
[EMAIL PROTECTED] 
> 


---------------------------------------------------------------------
To unsubscribe, e-mail:
[EMAIL PROTECTED] 
For additional commands, e-mail:
[EMAIL PROTECTED] 


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to