déc.
2011
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...
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...
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é.
Mes chers lecteurs,
J'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.
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.
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 :
byte
, short
, int
, long
, float
, double
)Byte
, Short
, Integer
, Long
, Float
, Double
)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.
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" ?
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 :
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.
Dans ce second article, je vous propose de découvrir les fonctionnalités de Guava relatives aux collections.
Nous nous intéresserons dans un premier temps aux Prédicats et aux Fonctions, puis nous découvrirons les nouvelles Collections proposées par Google.
Cet article fait partie d'une série :
How many times have you read the following sentence : "When you don't provide any constructor in a class, the compiler automatically inserts a default, no-args constructor for you" ?
So now you assume that every class with no apparent constructor has a hidden, default, no-arg constructor. Big mistake.
« billets précédents - page 6 de 35 - billets suivants »