Servlet tuning

Jejeje ps ando ocioso y me puse a ver que onda con el tuning en los servlets y ps (nolo sabia y espero sea de utilidad) encontre cosas muy curiosas y que ps disminuyen el tiempo de ejecucion del servlet bastante!

Escenario... pintar una tabla con 40000 filas(un simple for jaja :P)

jsp
[code]
<%--
Document : index
Created on : 30/12/2008, 12:49:37 AM
Author : jali
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>

JSP Page

/**
* Envia a lapagina solicitada
*/
function ir(valor) {
if(valor==1)
document.formEnvio.action="servlet/HeavyLoader";
if(valor==2)
document.formEnvio.action="servlet/LightLoader";
document.formEnvio.submit();
}

[/code]

Como se daran cuenta de aqui me dirijo a 2 servlets... Heavy & Light.
Heavy
[code]
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package com.jali.tuning.servletTuning;

import java.io.*;
import java.util.Date;
import javax.servlet.*;
import javax.servlet.http.*;

/**
*
* @author jali
*/
public class HeavyLoader extends HttpServlet {

/**
* Processes requests for both HTTP GET and POST methods.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
long ini=0;
long fin=0;
out.println("");
out.println("");
out.println("Servlet HeavyLoader");
out.println("");
out.println("");
out.println("

Servlet HeavyLoader at " + request.getContextPath () + "

");
ini = new Date().getTime();
for (int i = 0; i < 40000 ; i++) {
out.println(""+i+"");

}
fin= new Date().getTime();
out.println("tiempo:"+ (fin-ini));
out.println("");
out.println("");

} finally {
out.close();
}
}

// mas codigo

}

[/code]

Light
[code]
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package com.jali.tuning.servletTuning;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
*
* @author jali
*/
public class LightLoader extends HttpServlet {

/**
* Processes requests for both HTTP GET and POST methods.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
ServletOutputStream out = response.getOutputStream();
try {
long ini=0;
long fin=0;
out.print("");
out.print("");
out.print("Servlet LightLoader");
out.print("");
out.print("");
out.print("

Servlet LightLoader at " + request.getContextPath () + "

");
ini = new Date().getTime();
for (int i = 0; i < 40000 ; i++) {
out.print(""+i+"");

}
fin= new Date().getTime();
out.print("tiempo:"+ (fin-ini));
out.print("");
out.print("");

} finally {
out.close();
}
}

// mas codigo

}

[/code]

La implementacion es muy parecida, simplemente cambie un objetoPrintWriter por StringOutputStream y un metodo println por print

Esto al parecer tiene un manejo del performance mucho mejor:

Las salidas en 5 pruebas fueron las siguientes:

Light : tiempo:2230
Heavy : tiempo:7084

Light : tiempo:2942
Heavy : tiempo:3961

Light : tiempo:2243
Heavy : tiempo:4094

Light : tiempo:3156
Heavy : tiempo:4034

Light : tiempo:3068
Heavy : tiempo:4442

Cabe indicar que en paralelo ejecutando primero el Heavy y despues Light

Light 6398
Heavy 5069

En paralelo ejecutando primero el Light y despues Heavy

Light 5527

Heavy 10547 :OOOOOOO


Pruebas realizadas en una gateway, mandriva 2009, 2gb en ram. Servidor J2EE glassfish.
Mañana pongo elresultado en un websphere :]

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

printf

Puedes optimizar todavía más usando printf en vez de print o println si tienes Java 5. No sé si el output stream lo tenga pero el PrintWriter seguro trae printf y así puedes usar formatos en vez de concatenar strings (que es de lo primero que tienes que deshacerte, porque eso se traduce a uso de StringBuffers en tiempo de ejecución).

por ejemplo esto:

out.printf("<table><tr><td>%d</td></tr></table>", i);

es mucho más eficiente que esto:

out.print("<table><tr><td>"+i+"</td></tr></table>");

La razón por la que el stream es más rápido que el Writer supongo que es porque en uno estás usando println, que agrega un cambio de línea al final de la cadena, leyendo la propiedad de sistema line.separator y después hace un flush, así que es más lento hacer varias llamadas a println que a puro print o printf. La concatenación se va a tardar lo mismo con cualquiera de los dos métodos porque se hace antes de enviar el resultado por el stream o writer.

Incluso más rápido que printf puede ser usar puro print:

out.print("<table><tr><td>"); out.print(i); out.print("</td></tr></table">);

Given the choice of dancing pigs and security, users will choose dancing pigs, every single time. - Steve Riley

Imagen de jali

Ok!

Gracias por la info ezamudio, deja lo checo.
Saludos!