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
and
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
and
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
- jali's blog
- Inicie sesión o regístrese para enviar comentarios
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:
es mucho más eficiente que esto:
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:
Given the choice of dancing pigs and security, users will choose dancing pigs, every single time. - Steve Riley
Ok!
Gracias por la info ezamudio, deja lo checo.
Saludos!