Introducing Seren, the serialization speed enhancer

Seren (SERialization ENhancer) aims to enhance your classes so that they are much quicker to serialize.
It does so by instrumenting the classes at load-time to generate optimized writeObject / readObject methods, based on the best known practices (as seen in the JavaSpecialist Master Course).

The source code available on GitHub.
Feel free to take a look at it, any comment appreciated !


How does it work ?
Which classes should be enhanced is determined by a "filter", which is configured in the "seren.properties" configuration file (see below).
In each selected class, Seren will detect and optimize all non-static, non-transient fields. Also, final fields are not supported, because only the standart serialization system is allowed to re-set the value of final fields ; if you wish to serialize a class with final fields, please hide it from Seren.

How much faster will my objects be serialized ?
It entierely depends on the types of their fields. Numeric wrappers (Integer, Double...) and Strings are much faster (up to 3 times faster according to my – not necessarily accurate – benchmarks). Primitives are only as fast as usual.

Is there any risk / downside ?
There is absolutely no risk in testing Seren. As a Java Agent, it instruments your classes at load-time, and it totally transparent to your application. No need to modify any existing code either. Try it and measure the speed gain ; if it does not convince you, just remove the Java Agent option from the command line and you're done.

As for downsides, Seren provides a boost in serialization speed, but may generate slightly bigger serialized streams, so you sould not use it if you send big amounts of serialized data over a slow network. On the other hand, Seren works wonders for in-memory serialization (ex: EHCache make deep copies of your objects by serializing them to an in-memory byte array).

Lire la suite...

FooBarQix with a twist

A l'occasion de Devoxx FR 2012, David Gageot (@dgageot) et Jean-Laurent de Morlhon (@morlhon) ont proposé un atelier consistant à coder "en live" une application complète sur deux jours - oui, comme Notch au Ludum Dare :)

Pour sélectionner les participants et constituer des binômes cohérents, ils ont organisé un petit concours basé sur le kata "FooBarQix". Toutes les explications sont données sur le site code-story.net.

Evidemment, l'exercice est assez simple. Ce qui le rend intéressant, c'est la créativité des solutions soumises : tout est permis !

Lire la suite...

Du rififi dans l'arrondi

Vendredi, c'est arrondi !
Je vous propose une petite expérience amusante pour montrer que les calculs en virgule flottante ne font pas toujours ce qu'on pense...

Lire la suite...

Introduction au binaire, avec des vrais bouts de Java

Vous savez ce qu'on dit : "Il existe 10 types de personnes - ceux qui comprennent le binaire, et..."

Dans cet article, je rappellerai quelques principes basiques sur la représentation des nombres en binaire, les opérations associées, ainsi que les techniques de manipulation bas niveau des bits. Rien de méchant, mais il existe certaines API en Java dont l'usage nécessite une certaine connaissance de ces mécanismes, alors autant être préparé.

Lire la suite...

Nouvelle formation : Java Concurrency In Practice

Mes chers lecteurs,

JCIPJ'ai le plaisir de vous annoncer que je devrais, en 2012, ajouter une nouvelle corde à mon arc, en l'occurrence une nouvelle formation : Java Concurrency In Practice.

Si le nom vous dit quelque chose, c'est normal : c'est le titre du livre de Brian Goetz, Doug Lea, Tim Peierls, Joshua Bloch... qui fait référence (et mal au crâne) sur le domaine de la programmation parallèle/concurrente en Java.
La formation est basée sur le livre, sous la supervision des auteurs, et est développée par Heinz Kabutz, auteur de la fameuse newsletter et de la formation Java Specialist que j'anime déjà.

Bref, attendez-vous à du lourd.

D'ailleurs, je ne vous cache pas que c'est un peu intimidant pour moi aussi - je me sens un peu petit à côté de telles légendes... Mais je vais faire de mon mieux :)

La formation ne devrait pas être disponible avant mi-2012 (et toujours chez Zenika), j'aurai donc le temps de vous en reparler.

Au coeur du JDK : performance des conversions

Dans l'article précédent, qui portait sur la conversion des nombres, je vous ai affirmé que la conversion d'un nombre en chaîne était plus performante en utilisant Integer.toString() que la concaténation du nombre avec une chaîne vide (""+foo).

Comme je n'ai vu aucun commentaire de type "O RLY ?" à la suite de l'article, j'imagine que vous m'avez cru sur parole. C'est bien :) Mais ça va toujours mieux en le démontrant.
J'ai donc monté un petit benchmark pour comparer les deux techniques, en usant des précautions habituelles (nettoyage de la mémoire, optimisations de la JVM déjouées, code warming...).

Le code source complet est disponible en annexe, et tous les résultats présentés ci-dessous ont été obtenus sur un Intel E6300, 3Go ram sous Windows XP 32b et Java 6.0.24.

Lire la suite...

Au coeur du JDK : conversion des nombres

Aujourd'hui, je vous propose une petite révision sur la conversion entre les différentes représentations des nombres.

En Java, il est possible de représenter un nombre sous 3 formes :

  • en utilisant le type primitif adéquat (byte, short, int, long, float, double)
  • en utilisant la classe wrapper correspondante (Byte, Short, Integer, Long, Float, Double)
  • sous forme de chaîne de caractères, provenant le plus souvent d'une saisie utilisateur

Il existe des méthodes optimisées pour opérer des conversion entre ces trois formats. Il est important de les connaître, pour des raisons de lisibilité et de performance.

Lire la suite...

Niveaux de criticité dans Jenkins, Sonar, PMD et Checkstyle

Sonar permet de configurer, via une interface graphique, les niveaux de criticité des alertes remontées par PMD et Checkstyle. Ces niveaux peuvent ensuite (après quelques réglages) servir à influencer la santé des builds dans Jenkins - par exemple, l'utilisation de System.out.println provoquera un simple warning, alors que le lancement manuel d'un Throwable fera échouer le build.

Le problème, c'est que chaque outil dispose de ses propres niveaux de criticité, et il n'est pas toujours simple de déterminer leur correspondance d'un outil à l'autre : un réglage "minor" dans Sonar correspond-il à "info" ou "warning" dans PMD ? Et Jenkins le comprendra-t-il comme une alerte de type "low" ou "normal" ?

Lire la suite...

Guava par l'exemple (3/3) : I/O

Dans ce troisième et dernier article, je vous propose de découvrir les fonctionnalités de Guava relatives à la gestio des entrées/sorties (I/O).
Que ce soit pour réaliser des opérations systèmes (copie de fichier, déplacement...), ou pour travailler avec des fichiers textuels ou binaires, le package com.google.common.io regorge de fonctionnalités pratiques.

Cet article fait partie d'une série :

Lire la suite...

De l'utilité d'un bon hashCode

La bonne implémentation de la méthode hashCode() a une conséquence directe sur les performances des collections de type Hash* (HashSet, HashMap...).

Pour le démontrer, je vous propose une petite expérience : nous allons mesurer le temps nécessaire à l'insertion d'un grand nombre d'objets dans un HashSet, en fonction de la qualité de leur algorithme de hachage.

Lire la suite...

- page 4 de 11 -