Acelera tu laptop Windows con ReadyBoost

Si ya se que en muchos sitios, incluidos comentarios de gente de soporte de Microsoft, te dirán que es una tecnología para computadoras viejas con 512MB de RAM o menos. Que si tienes más de 2GB de RAM no hará ningún efecto.

Bueno en este post me propongo a demostrarte, no sólo que es mentira sino que además sí es útil en cualquier máquina de esta era. Mi intención es convencerte de que al menos lo pruebes y veas si te ayuda o no.

Vamos a tratar los siguientes temas:

  1. Invitarte a probarlo, con una pequeña introducción de como usarlo.
  2. En cuáles escenarios he visto que tiene mayor impacto.
  3. Un poco de explicación técnica para fundamentar los hechos.
  4. Un enlace en inglés donde la gente habla de los beneficios de la tecnología.
  5. Invitarte a probarlo una vez más.
Manos a la obra.

Usando ReadyBoost

Para usar Readyboost únicamente necesitas un Pen Drive o una tarjeta SD con al menos 1GB de espacio libre.
  • Inserta el pendrive o la tarjeta SD.
  • Windows debería presentar una pantalla indicando entre las opciones Aumentar la velocidad del sistema con Windows ReadyBoost.
  • Si no aparece siempre puedes hacer clic derecho sobre la unidad en el explorador de archivos y escoger Propiedades
  • Ahí hay una pestaña llamada ReadyBoost. Marca o "Dedicar este dispositivo a ReadyBoost" o le dices cuánto espacio dedicar. Alrededor de 2GB estaría bien. Cuanto más espacio le dediques más cosas podrá guardar en el caché.
Y eso es todo deja que poco a poco llene el caché. Dentro de unas horas prueba mandarla a Hibernar y despiértala y ve si notas alguna diferencia. 

No te pido que me creas sólo que des el beneficio a la duda y lo pruebes. Seguro tienes por ahí un pendrive o una SD.

Probando el ReadyBoost

Hay escenarios donde se nota la diferencia al usar Readyboost. Algunos ejemplos:

  • Hibernar: Este proceso deja a Windows por un tiempo sin caché en la RAM y en ese tiempo va a usar el disco duro a menos que lo que esté buscando lo haya guardado en el Pen Drive. Se nota clara la diferencia al despertar de la Hibernación y tratar de abrir algunas aplicaciones como Google Chrome.
  • Aplicaciones que se tragan la memoria: Especialmente VirtualBox o cualquier tecnología de virtualización se le nota la diferencia al arranque si se tiene ReadyBoost. Varias personas afirman que los juegos trabajan mejor con ReadyBoost
  • Discos duros lentos: Como los de las laptops y de ahí viene el título del post, las laptops son las máquinas que más se benefician del Readyboost. Además mejora el rendimiento de la batería y la laptop se calienta menos (claro estas dos cosas son mucho más difíciles de medir).
  • Arranque de aplicaciones: Levantar cualquier aplicación como un navegador o aplicación de ofimática.


Explicación técnica

Un disco duro tradicional tiene una lectura secuencial mucho mayor que cualquier pen drive o tarjeta SD. Pero para lecturas aleatorias, es decir leer un pedacito de un archivo o un archivo pequeño, es extremadamente lento en comparación a las memorias. ¿Por qué? Porque para buscar algo específico tiene que mover el cabezal y eso toma tiempo. Si se necesitan leer muchos archivitos esparcidos por el disco, como cuando se abre una aplicación, pues la cosa se pone lenta.

Superfetch

Para minimizar esto Windows monitorea esos archivitos o pedacitos y los pega todos en unos archivos (una copia de ellos) en una carpeta llamada Prefetch. El asunto es más complejo de lo que digo. Pero es para que te hagas una idea. El objetivo es aprovechar que la lectura secuencial es más rápida y leer todo eso a memoria RAM de un sólo golpe. Luego las aplicaciones en lugar de buscar las cosas en disco lo hacen en memoria RAM.

ReadyBoost

Aquí es donde entra ReadyBoost. Si la tecnología está activada el caché de Superfetch se graba también en los dispositivos configurados para ReadyBoost. Es aquí donde la mayoría le pierde la fé a la tecnología por señalarla que sólo sirve si tienes poca memoria RAM. Ya que el Superfetch además de estar en el ReadyBoost está en memoria RAM. Obviamente la memoria RAM es más rápida que la memoria flash.

El problema es que no siempre se tiene el Superfetch en memoria RAM. No sólo eso sino que a veces no todo el Superfetch cabe en RAM así que Windows coloca ahí lo más usado y lo demás lo deja en el ReadyBoost y en el disco duro. Más adelante te mostraré cómo ver el tamaño del caché ReadyBoost y después de unos días de uso, pues no es factible tener todo eso en RAM.

El caso claro donde el Superfetch no está en RAM es cuando se vuelve de una hibernación. Windows únicamente guarda lo estrictamente necesario de la RAM en el archivo hiber.sys. Y eso no incluye el Superfetch. Cuando se vuelve de la hibernación la única manera de acceder al Superfetch es en el disco duro y en el ReadyBoost, el cual si se tiene activo será aprovechado inmediatamente.

Hay otros casos como levantar máquinas virtuales o aplicaciones pesadas como Outlook, navegadores, Office o juegos. Donde es útil tener un caché ReadyBoost bien poblado.

Yo tengo una laptop de 16GB y mi esposa una de 12GB y les digo se nota cuando por X o por Y el ReadyBoost no está activo.

Referencias

Aquí hay una discusión interesante. Son usuarios que se quejan porque cuando Windows cree que no hay ganancia por ReadyBoost lo deshabilita. Ellos dicen que debería darle la opción al usuario si quiere usarlo o no. En la mitad del foro aparecen quienes dicen que si tienes más de 2GB (incluida alguien de Microsoft) no te aporta ningún beneficio. Y aparecen los que sí le han encontrado utilidad y describen como.


Cito algunos:

"To all the people who continue to ask: "why do u need ready boost,YOU DON'T NEED IT ; if u have SSD or 4GB RAM you dont need ReadyBoot"
 WAKE UP PEOPLE!! Programs like 3Ds Max use ReadyBoost as actual RAM, ie if you render a large 3D model with 4GB RAM the program will definitely crash, but if you have another 8GB ReadyBoost it will run smoothly. The SSD does not solve the problem, Paging also doesnt solve it, and to all the people who are saying well why dont you just buy some extra RAMs, the new ultrabooks come with a fixed ammount of RAMs on the motherboard, YOU CANNOT ADD RAMs, and they come with SSDs... So technically its a dead end to people who want to use their i7 ultra books for something productive and not just Facebook...

Thank you" HazemJouzou

"I have W530 lenovo work laptop with an i7, 12GB RAM and a spinner HD.  I paid $10 to get a 24GB msata ssd just to use readyboost and it works well for speeding up the HDD access times. I dedicate 10GB of the msata drive to readyboost.  Savhp

"oh, and just my 2 cents for those people who say ready boost isn't needed.
I have 8Gb of memory. but get poor performance when I run some games. but when I use ready boost, I see an actual improvement in the games ability to run. one example would be BF4. when I am using ready boost (2x 32Gb drives) I don't get hiccups and frame rate issues when spawning.

another thing to consider is this, Memory is memory. regardless if it is called virtual memory, RAM, or Readyboost. having more memory, no matter how new your system is, can never, ever, be a bad thing." Cybot

"For those still arguing that ReadyBoost doesn't do much they should try a bit of testing first.  With the systems I work on (Win 7, Win 8, 2-8GB memory, etc.) I see at least a 50% and regularly 200% increase in random read speed (using for example Defragglers Benchmark).  This just makes the system more responsive and quicker to do system maintenance (updates, defragging, backups, installs/uninstalls, etc.).  It is not huge, but it is noticeable when working on a typical system. EcurbNosneb

Invitación a la prueba

¿Ya te convencí? Bueno puede que no, pero al menos no dirás que no vale la pena probarlo.

Adelante... sólo inserta un pendrive o una tarjeta SD y deja que la tecnología haga lo suyo.

Hasta la próxima...

Nota: Si esta información te es de utilidad o piensas que se puede mejorar, por favor deja un comentario con tus observaciones.

Tutorial rsync por ssh sin configurar servicio: Transfiere únicamente lo que cambió

Rsync es una herramienta muy potente para sincronización rápida de directorios y que se puede usar a través de ssh sin requerir ninguna configuración especial en el servidor. Aquí hablaremos de:

  • Tutorial para comenzar a usar rsync inmediatamente. Ejemplos.
  • Utilizar rsync a través de ssh.
  • Enviar únicamente los cambios realizados, para backup por ejemplo.
  • Comprimir la transmisión.
  • Transferir únicamente cambios en archivos grandes.

Rsync es una de las herramientas más útiles que he utilizado en los últimos tiempos y ahora lo uso a diario. Anteriormente siempre lo vi como un misterio que había que montar un servicio rsync para poder sincronizar dos máquinas remotamente. Bueno, recientemente descubrí que se puede transferir usando únicamente ssh.

Supongamos que queremos transferir el contenido de un directorio con sus subdirectorios desde una máquina local a una remota por ssh:
rsync -avz -e ssh /home/usuario/directoriofuente/ usuario@ipremota:/home/usuario/directoriodestino/ 
Ahora estudiemos la instrucción:

  1. La opción a nos dice que va a preservar los permisos y usuarios siempre que pueda.
  2. La opción v nos muestra que está haciendo.
  3. La opción z le dice a rsync que comprima mientras transfiere los archivos. Muy útil si el destino está en Internet.
  4. El comando -e ssh le dice que use ssh para transferir archivos, esto nos evita un servicio rsync y además transmite seguro.
  5. Es importante notar los / al final de los directorios, es necesario colocarlos para asegurarse que copie todo y no confunda las cosas con archivos.
Otras opciones interesantes:
  • --progress: Muestra el progreso mientras se copian archivos grandes.
  • --delete: Borra en el destino los archivos que no encuentre en la fuente. Muy muy útil para mantener directorios perfectamente sincronizados.

Transfiere únicamente lo que cambió


El gran poder del rsync es cuando se quiere transferir por segunda vez. Él únicamente transfiere lo que cambió y más aún si lo que cambió es un archivo muy grande de varios megas hasta gigas él únicamente transfiere las partes del archivo que cambiaron.
Ahora la gran utilidad de esto es poder mantener sincronizadas dos máquinas, para cambios en sitios web por ejemplo, o inclusive programas java ya que se puede extraer el jar en ambas máquinas, transferir y luego volverlos a comprimir. Únicamente se transferirán los cambios.

Al aprender a usar rsync en el día a día nos acelera bastante el hecho de mantener sincronizados los directorios con nuestros discos externos, backups, dropbox, etc

Hasta la próxima...

kde4 uso eficiente del plasma (uso no evidente)

Hola,

Hasta hace muy poco utilicé openSUSE con KDE 3 y una de las cosas que extrañé cuando definitivamente me moví a KDE 4 en openSUSE 11.2, es que en KDE 3 uno puede invocar el menú inicio (K menú) poniendo el cursor en la esquina inferior izquierda de la pantalla sin hacer clic. Una tontería, pero buscando una característica similar en KDE 4 me encontré con una muchísimo más poderosa.. el tablero de mandos del plasma.

Y es que combinando 3 cosas:

  1. El tablero de mandos del plasma.
  2. Los elementos gráficos.
  3. Los bordes de escritorio y los efectos de KWin.
Se puede tener una especie de mesa de trabajo (escritorio) con el menú K desplegado, una calculadora, un calendario, el selector de color, etc. Que está a sólo mover el ratón a una de las esquinas de la pantalla. Aquí unas imágenes de lo que estoy tratando de explicar:




Pasos a seguir:

  1. Asignar el tablero de mandos a una de las esquinas del escritorio (prefiero esquina inferior izquierda):



  2. Separar el tablero de mandos del escritorio. Ésto lo hago porque en el escritorio me gusta tener un fondo algo que haga juego con las ventanas y no herramientas de trabajo que haga que se parezca a mi escritorio real (un desastre).



  3. Invocar el tablero de mandos y agregar los elementos gráficos que más usemos. Yo en lo particular recomiendo el menú K (Lanzador de aplicaciones) ponerlo del mismo tamaño que el menú real (se puede presionar la tecla Ctrl mientras cambiamos su tamaño para mayor control; una calculadora; un conversor de unidades; un calendario y algunos iconos de los programas más usados. No recomiendo colocar alguno que nos mantenga más de unos segundos en el tablero (como un terminal).




Adicionalmente:


Asigno la Rejilla del escritorio y Presentar las ventanas a las otras esquinas del escritorio:





Conclusión

Por ensayo y error conseguí el increíble poder que tiene el plasma y de por qué se le da tanta fuerza dentro de KDE y openSUSE. Lamentablemente como me sucedió a mi, su uso eficiente no es tan evidente como se quisiera. Yo le recomiendo a la gente de KDE y openSUSE que saquen una configuración de plasma por omisión, para sacarle el mayor provecho sin tener que configurar.

Queremos escuchar tus experiencias, publica tus comentarios de como te fue con los tips o si ¿Tienes otros mejores? ¿Qué piensas del Plasma?

Hasta la próxima...

Validando xml con xsd usando msv

Hola,

Parte del proceso de utilizar xml para el intercambio de datos, por ejemplo importación y exportación de datos hacia y desde nuestro sistema respectivamente, es tener clara una definición del archivo xml que se va a utilizar. Para ello generamos un archivo xsd (XML Schema) con la definición de nuestro xml.

Ahora bien antes de intentar cargar una data en formato xml en nuestro sistema, es aconsejable primero verificar que el archivo está bien formado y luego si cumple con nuestra definición. Bueno hoy les enseñaré como hacerlo en Java.

Primero necesitamos una biblioteca llamada msv (Multi Schema Validator) se puede descargar desde aquí: https://msv.dev.java.net/ . Este paquete funciona de dos maneras:
  1. Como un programa de línea de comandos para validar xmls con un xsd que se especifique.
  2. Como una biblioteca que permite validar xmls con xsds directamente desde nuestro código en Java.
Para probar como funciona, vamos a descargar el zip del msv y expandirlo en cualquier directorio (tiene su propia carpeta) ahora para probarlo ejecutamos la siguiente línea de comandos:

java -jar msv.jar mi.xsd mi.xml

Si todo sale bien y el documento es válido debería soltar:
start parsing a grammar.
validating mi.xml
the document is valid.
Ahora bien para usarlo desde nuestro código Java lo primero que hay que hacer es incluir todos los jar de la carpeta msv en nuestro classpath (isorelax.jar, relaxngDatatype.jar, xmlParserAPIs.jar, msv.jar, xercesImpl.jar, xsdlib.jar). Luego el siguiente código nos permite validar nuestro xml:

/* Paso 1 creamos el fabricador de verificadores */
VerifierFactory factory = new com.sun.msv.verifier.jarv.TheFactoryImpl();

/* Paso 2 compilamos el esquema (nuestro archivo xsd) */
Schema schema = factory.compileSchema(new File("mi.xsd"));

/* Paso 3 creamos el verificador */
Verifier verifier = schema.newVerifier();

/* Paso 4 validamos */
if(verifier.verify(new File("mi.xml"))) {
// el documentos es válido
} else {
// el documento es inválido
}


Con ésto estamos listos. Algo muy importante si la verificación la estamos haciendo en una PC que no tiene conexión al Internet, vamos a tener que agregar el componente resolver de Apache XML Commons al classpath. Se puede descargar aquí: http://xml.apache.org.


Hasta la próxima...

Nota: Si esta información te es de utilidad o piensas que se puede mejorar, por favor deja un comentario con tus observaciones.

Utilizar wine para probar aplicaciones Java en ambiente Windows desde Linux

Actualizado: Revisado para wine 1.4 y Java 1.6.0u32, 4 de junio de 2012

Al leer este título, lo primero que viene a la mente es: ¿Para qué correr aplicaciones Java sobre wine si Java existe para Linux? Además las aplicaciones Java son multiplataforma. Ajá, paremos ahí y revisemos la última palabra de la frase: multiplataforma.

Muchas veces queremos verificar que tal corre nuestra aplicación en otra plataforma, para precisamente verificar que es multiplataforma. Hay varias cosas que pueden dejar de funcionar (o funcionar diferente) cuando se corre en otra plataforma:
  • Nombres de archivo: Los separadores de nombres de archivo es lo más cambiante entre plataformas.

  • Llamadas a comandos externos: Hay unos cuántos problemas que se solucionan fácilmente en Linux invocando comandos ¿Y en Windows?. Un ejemplo a éste respecto es el método listRoots() de la clase File. Si se quiere saber los volúmenes montados, en Windows funciona perfecto, pero en Linux únicamente retorna "/", entonces una de las maneras de resolverlo es invocando al comando df (entre otros) parsear su salida y obtener las unidades montadas.

  • Codificación de caracteres: Nuestras letras acentuadas comúnmente se ven mal en otras plataformas si no tenemos el debido cuidado.

  • Applets: Probar nuestros applets en navegadores que no corren en nuestra plataforma de desarrollo. Por ejemplo, Internet Explorer sobre Linux. No sólo estaríamos probando nuestra aplicación en otra plataforma sino además en otro navegador.
Para los casos antes mencionados y algunos otros, nos gustaría verificar que tal corre nuestra aplicación en otra plataforma. Específicamente si estamos desarrollando en Linux, poder correr la aplicación en Windows. Si tenemos dual boot, perfecto, reiniciamos la PC en Windows y listo. El problema es todo lo que tenemos que esperar para hacer una prueba. Para ésto podríamos usar wine.

Para utilizar java sobre wine, simplemente se instala la versión Windows de la máquina virtual de Java usando wine así:

wine jre-6u32-windows-i586.exe


Una vez instalado, simplemente corremos nuestro programa en "Windows" así:

wine java -jar ~/jdk/demo/jfc/SwingSet2/SwingSet2.jar


Fíjense que la única diferencia es colocar wine adelante. Si tienen problemas gráficos prueben deshabilitar Direct3D:

wine java -Dsun.java2d.d3d=false -jar ~/jdk/demo/jfc/SwingSet2/SwingSet2.jar



Les en va a impresionar lo bien que corre.


Por supuesto siempre tenemos la opción CrossOver para hacer lo mismo en unos pocos clics. Presiona aquí para instalar Java Windows en Linux: https://www.codeweavers.com/compatibility/browse/name/?app_id=3883


Applets

Uno de los usos más frecuentes para wine es correr Internet Explorer en Linux y así probar como se ven nuestros sitios web. Bueno si somos desarrolladores de Applets, podríamos usar Internet Explorer sobre wine para poder verlos sin tener que salir de Linux. Basta con tener instalado Internet Explorer antes de instalar java. ¿Y que tal un applet en Firefox sobre windows?

Aquí les presento las instrucciones para hacer correr applets en java 1.4 Internet Explorer 6.0 Windows 98, escojo esta configuración porque todo corre casi perfecto.
  1. Instalar Internet Explorer 6.0 en wine simulando Windows 98, en este paso no me extenderé ya que hay sin número de artículos que lo explican. Usen winetricks para ello. Si tienen Crossover (versión comercial de wine) es cuestión de unos clics.
  2. Instalar Java 1.4 para Windows 98 en wine. Aquí les dejo el enlace: https://java.sun.com/products/archive/j2se/1.4.2_19/index.html
  3. Hasta aquí los applets deberían correr perfectamente. Pues no, así como la versión 6 de java tiene problemas con Direct3D en wine, java 1.4 los tiene con DirectDraw, cosa que no es tan sencilla desactivar para los applets. Lo que hay que hacer es ejecutar a mano el panel de control de java en wine, desactivando el directdraw para poderlo mostrar y ahí desactivar el directdaw para los applets. Aqui el comando:
    cd ~/.wine/drive_c/Program\ Files/Java/j2re1.4.2_19/lib/

    wine java.exe -Dsun.java2d.noddraw=true -Xbootclasspath/a:plugin.jar sun.plugin.panel.ControlPanel

    Cuando se esté ejecutando el panel de control, se debe ir a la pestaña Avanzado y escribir -Dsun.java2d.noddraw=true en al campo Parámetros del entorno de ejecución y presionar Aplicar.
Con los pasos anteriores ya los applets deberían correr en Internet Explorer en Linux. Para versiones posteriores es posible que se necesite la misma técnica para deshabilitar el Direct3D en java. Cuando tenga una buena prueba actualizaré este post.

Hasta la próxima...

Nota: Si esta información te es de utilidad o piensas que se puede mejorar, por favor deja un comentario con tus observaciones.

Mejora el rendimiento de tu aplicación web usando compresión

Una de las características que tienen los navegadores de hoy en día, es poder aceptar contenido comprimido con gzip o con zip. Esto supone una enorme reducción en el peso de nuestras páginas, ya que el código HTML tiene muchas repeticiones en su contenido. Estamos hablando que en general (sin contar imágenes) nuestras páginas y código javaScript obtienen una reducción de mucho más del 50% (estamos hablando de alrededor de un 70%). Eso se traduce directamente en que nuestras páginas cargan más rápido.

Ya los grandes como Google o Yahoo están utilizando esta capacidad para mejorar el rendimiento de sus sitios. Ahora, ¿Por qué los servidores web (Apache, tomcat, Jboss, etc) no tienen esa opción habilitada por omisión? La razón es que los browsers antiguos contenían errores y soporte muy precario para el contenido comprimido.

Yendo al grano. ¿Cómo habilitar la compresión?

Tomcat / JBoss:
  • Abrir el archivo server.xml, localizar los conectores:

  • <connector port="8080" maxhttpheadersize="8192" maxthreads="150" minsparethreads="25" maxsparethreads="75" enablelookups="false" redirectport="8443" acceptcount="100" connectiontimeout="20000" disableuploadtimeout="true" emptysessionpath="true" >
  • Agregar los siguientes atributos:
    • compression = "on"
    • compressableMimeType = "text/html,text/css,text/javascript,text/xml"


    Estos atributos le dicen al tomcat que comprima todo el contenido de los tipos especificados.

Se deben colocar en todos los conectores, para así habilitar la compresión para SSL y las conexiones que vienen a través de un servidor Apache o IIS.

Si estamos sirviendo contenido para internet, lo más probable es que tengamos un Apache que sirve el contenido estático y le pase a tomcat/jboss el control para procesar el contenido dinámico. En este caso debemos también configurar Apache para que sirva el contenido estático comprimido.

Otra de las razones por las que no se habilita por omisión la compresión, es por el impacto en rendimiento que puede causar en los servidores. Con los servidores que hay ahorita pienso que es seguro habilitarla. Sin embargo, no está demás considerarlo y hacer las pruebas respectivas. Existe la manera de utilizar contenido precomprimido, pero eso aún no lo he investigado. Cuando lo tenga claro escribo otro post.

Si se tiene sólo al tomcat/jboss atendiendo las peticiones, recomiendo habilitar las librerías nativas APR. Las instrucciones están en otro post (Librerías nativas Tomcat 5.5 y 6.0).

Apache:

Hay dos formas equivalentes, o se crean archivos .htaccess o se edita el archivo httpd.conf, /etc/apache2/default-server.conf o sus equivalentes. Pero el contenido que se coloca es el mismo:

# compress all text & html:
AddOutputFilterByType DEFLATE text/html text/css text/xml text/javascript application/xhtml+xml application/x-javascript text/x-js

Esto se pone tal cual en los .htaccess y dentro de los tags <Directory> en los otros archivos como el httpd.conf o el /etc/apache2/default-server.conf. Esta instrucción le dice al servidor que todos los tipos de archivo ahí especificados los mande comprimidos. Ejemplo:

<Directory "/srv/www/htdocs">
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs-2.2/mod/core.html#options
# for more information.
Options All
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
AllowOverride None
# Controls who can get stuff from this server.
Order allow,deny
Allow from all


AddOutputFilterByType DEFLATE text/html text/css text/xml text/javascript application/xhtml+xml application/x-javascript text/x-js

</Directory>

Hay que asegurarse que el módulo mod_deflate está instalado. Eso en Linux se verifica en la variable de /etc/sysconfig/apache2 APACHE_MODULES. Ejemplo:
APACHE_MODULES="unique_id  ... mod_jk jk mod_deflate"
¿Alguna pregunta? Bienvenida

Hasta la próxima...

Nota: Si esta información te es de utilidad o piensas que se puede mejorar, por favor deja un comentario con tus observaciones.

Java 1.5 Usar autoboxing o métodos valueOf para mejorar el rendimiento (Ventajas)

Java 1.5 vino con varias mejoras en el lenguaje. Entre ellas autoboxing y autounboxing. ¿Y para que sirve? si tienes que usar un objeto "wrapper" para meter enteros en una lista por ejemplo, en vez de usar new Integer(numero), usas directamente número. Entonces imaginemos que queremos meter 3 números en una lista, en Java 1.4 se haría así:

List lista = new ArrayList();

lista.add( new Integer( 1));
lista.add( new Integer( 2));
lista.add( new Integer( 3));

En Java 1.5 se haría así:

List <Integer> lista = new ArrayList<Integer>();

lista.add( 1);
lista.add( 2);
lista.add( 3);

El compilador se encarga de crear los objetos wrapper por uno.

Esta característica pareciera sólo cosmética, es decir, que sólo serviría para poner el código más bonito. Pero resulta que por dentro tiene una optimización.

Las clases wrapper en Java 1.5 ahora tienen unos métodos llamados valueOf. Que simplemente reciben un número y devuelven la clase wrapper correspondiente. Bueno resulta que cuando java hace autoboxing no usa los constructores (new Integer) sino los métodos valueOf. La ventaja de estos métodos es que guardan un caché de instancias de números más usados (-127..128). en general rara vez los números pasan de ese rengo. Como las clases wrapper son inmutables no importa tener la misma instancia para todos los Integer que representen el número 1. Así en vez de tener innumerables instancias de Integer que embasuren la memoria y enlentezcan el Garbage Collector(ya que en su mayoría son objetos que tienen muy corta vida) y que además todos representen el mismo número, se tenga una única instancia por cada número distinto.

En resumen, usar el autoboxing no sólo hace más sencillo el código, sino que además es más eficiente en cuanto al consumo de memoria se refiere.

Si no se quiere usar el autoboxing porque puede ser confuso, al menos deberían usarse los métodos valueOf. El código anterior quedaría así:

List <Integer> lista = new ArrayList<Integer>();

lista.add( Integer.valueOf( 1));
lista.add( Integer.valueOf( 2));
lista.add( Integer.valueOf( 3));
Hasta la próxima...

Nota: Si esta información te es de utilidad o piensas que se puede mejorar, por favor deja un comentario con tus observaciones.

Búsqueda

CodeWeavers