style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Acelerando una peticion Http por UrlConnection

Hola!
Estoy desarrollando una aplicacion que necesita hacer peticiones Http mediante post en una clase.
Ahora... yo (me imagino, mas ahora me doy cuenta que es lo contrario; al menos en mi caso) que leer linea por linea la respuesta de un UrlConnection es mas lento que leer un buffer... Haciendo pruebas, me dicuenta de lo contrario.

Mis metodos son:

Leyendo del buffer:

public void getPostResponse1(String pUrl, String params) throws MalformedURLException, IOException {
        URL url = new URL(pUrl);
        long ini = new Date().getTime();
        long fin = 0;
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "time: " + ini);
        URLConnection urlConnection = url.openConnection();
        urlConnection.setDoOutput(true);
       
        OutputStreamWriter out = new OutputStreamWriter(
        urlConnection.getOutputStream());

        out.write(params);
        out.flush();

        final InputStream is = urlConnection.getInputStream();
        final Reader reader = new InputStreamReader(is);
        final char[] buf = new char[16384];
        int read;
        final StringBuffer sb = new StringBuffer();
        while ((read = reader.read(buf)) > 0) {
            sb.append(buf, 0, read);
        }
        fin = new Date().getTime();
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "time: " + fin);
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "exec time: " + (fin - ini));
        is.close();
        out.close();
    }

salida:

14/06/2009 01:26:11 PM httpUtils.HttpUtils getPostResponse1
GRAVE: time: 1245003971044
14/06/2009 01:26:11 PM httpUtils.HttpUtils getPostResponse1
GRAVE: time: 1245003971100
14/06/2009 01:26:11 PM httpUtils.HttpUtils getPostResponse1
GRAVE: exec time: 56
14/06/2009 01:26:11 PM xmlformat.Main main

Ahora... 56 milisegundos no es tiempo considerable.... pero dado que sera un aplicacion con una concurrencia de 50 usuarios.... = 2800 milisegundos de procesamiento... ya es algo no?

Pero... leyendo linea por linea de un InputStreamReader

public void getPostResponse2(String pUrl, String params) throws MalformedURLException, IOException {
        URL url = new URL(pUrl);
        long ini = new Date().getTime();
        long fin = 0;
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "time: " + ini);
        URLConnection urlConnection = url.openConnection();
        urlConnection.setDoOutput(true);

        OutputStreamWriter out = new OutputStreamWriter(
        urlConnection.getOutputStream());

        out.write(params);
        out.flush();
        String salida = "";
        BufferedReader in = new BufferedReader(
        new InputStreamReader(urlConnection.getInputStream()));
        String line = null;
        while ((line = in.readLine()) != null) {
            salida += line;
        }
        fin = new Date().getTime();
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "time: " + fin);
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "exec time: " + (fin - ini));
        in.close();
        out.close();
    }

Y la salida es :

14/06/2009 01:26:11 PM httpUtils.HttpUtils getPostResponse2
GRAVE: time: 1245003971101
14/06/2009 01:26:11 PM httpUtils.HttpUtils getPostResponse2
GRAVE: time: 1245003971109
14/06/2009 01:26:11 PM httpUtils.HttpUtils getPostResponse2
GRAVE: exec time: 8

El tiempo se reduce notablemente... 8 x 50 = 400 milisegundos

Saludos

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

cuántas corridas?

Corriste ambos métodos varias veces? una corrida no es suficiente, te recomiendo corras cada método 10 veces y veas si varia mucho el tiempo porque no siempre va a ser igual, hay muchas variables a tomar en cuenta. Corre cada uno 10 veces y saca el promedio y compáralos...

Otra idea es que hagas tu buffer un poco más grande, a menos que sepas que la respuesta es corta (veo que lees de 16 en 16KB). Y por último, puedes intentar leer directamente con el InputStream sin convertir a Reader, y puedes usar un LineNumberInputStream que también tiene método readLine, es otra opción y tal vez sea más rápido que usar el BufferedReader envolviendo el InputStreamReader envolviendo el InputStream...

Imagen de jali

Infinito

Que onda Enrique!
Lo mande en un ciclo infinito, y en todos el resultado era similar. En el primiero llegaba a subir a 200 - 260 el tiempo de execucion y en el segundo no pasaba de 50.
Intente igualmente con un buffer 10 veces mayor y el resultado no bajaba considerablemente(a 40 -50 aprox) voy a intentar lo del LineNumberInputStream y comento sobre el resultado.
Gracias

Imagen de 1a1iux

Mal entendido

No sé si entendí mal o que cosa, pero sólo por aclarar y para que no se preste a un mal entendido, comento:

Cuando usamos un BufferedReader para leer "línea por línea" estamos usando un buffer, el nombre de la clase es demasiado obvio, jeje.

En fin, sugiero que hagas pruebas con un buffer de 8K que es el tamaño por defecto del BuffererReader, a ver si se ve algún cambio notable con
tu primer método.

Sale y vale
Byte

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">