StringBuilder
Par liguorien, vendredi 1 avril 2005 à 11:06 :: Java :: #73 :: rss
J'ai déjà mentionné dans ce billet que les performances de la classe String étaient vraiment mauvaise pour la construction d'une chaine de caractère avec l'opérateur +=. Je vous avais recommendé d'utiliser plutôt la classe StringBuffer pour ce type d'opération. Ce qui est (et reste encore) une bonne pratique.
Je viens tout juste de découvrir l'existance de la classe StringBuilder qui est livré avec le JDK 5.0.
Encore une nouvelle classe ? Et pourquoi donc ?
C'est à cause que les méthodes de la classe StringBuffer sont synchronisées. Ce qui entraine forcément une baisse de performances...
Dans la majorité des cas, la construction d'une chaine de caractère se fait dans le corp d'une méthode, donc accessible seulement que pour un Thread singulier. Sun à donc décider de créer la même classe, sans la synchronisation.
Je viens tout juste de découvrir l'existance de la classe StringBuilder qui est livré avec le JDK 5.0.
Encore une nouvelle classe ? Et pourquoi donc ?
C'est à cause que les méthodes de la classe StringBuffer sont synchronisées. Ce qui entraine forcément une baisse de performances...
Dans la majorité des cas, la construction d'une chaine de caractère se fait dans le corp d'une méthode, donc accessible seulement que pour un Thread singulier. Sun à donc décider de créer la même classe, sans la synchronisation.
Étant curieu, j'ai tout de suite fait un petit benchmark pour tester les différentes façon de construire un String dynamiquement à l'intérieur d'une boucle. Voici le code :
Java
public class Test {
//nombre d'itération
private final static int LOOP = 10000;
public static void main(String[] args){
testString();
testStringBuffer();
testStringBuilder();
}
/**
*méthode qui test la classe String
*/
private static void testString(){
final long time = System.currentTimeMillis();
String str = "";
for(int i=0; i<LOOP; i++){
str += "liguorien";
}
System.out.println("String : " + (System.currentTimeMillis()-time) + "ms");
}
/**
*méthode qui test la classe StringBuffer
*/
private static void testStringBuffer(){
final long time = System.currentTimeMillis();
StringBuffer str = new StringBuffer();
for(int i=0; i<LOOP; i++){
str.append("liguorien");
}
System.out.println("StringBuffer : " + (System.currentTimeMillis()-time) + "ms");
}
/**
*méthode qui test la classe StringBuilder
*/
private static void testStringBuilder(){
final long time = System.currentTimeMillis();
StringBuilder str = new StringBuilder();
for(int i=0; i<LOOP; i++){
str.append("liguorien");
}
System.out.println("StringBuilder : " + (System.currentTimeMillis()-time) + "ms");
}
}
//nombre d'itération
private final static int LOOP = 10000;
public static void main(String[] args){
testString();
testStringBuffer();
testStringBuilder();
}
/**
*méthode qui test la classe String
*/
private static void testString(){
final long time = System.currentTimeMillis();
String str = "";
for(int i=0; i<LOOP; i++){
str += "liguorien";
}
System.out.println("String : " + (System.currentTimeMillis()-time) + "ms");
}
/**
*méthode qui test la classe StringBuffer
*/
private static void testStringBuffer(){
final long time = System.currentTimeMillis();
StringBuffer str = new StringBuffer();
for(int i=0; i<LOOP; i++){
str.append("liguorien");
}
System.out.println("StringBuffer : " + (System.currentTimeMillis()-time) + "ms");
}
/**
*méthode qui test la classe StringBuilder
*/
private static void testStringBuilder(){
final long time = System.currentTimeMillis();
StringBuilder str = new StringBuilder();
for(int i=0; i<LOOP; i++){
str.append("liguorien");
}
System.out.println("StringBuilder : " + (System.currentTimeMillis()-time) + "ms");
}
}
J'ai fait le test sur un Pentium 4, 1.8ghz, 1go RAM, Windows XP SP2 et J2SE 5.0_02.
Voici les résultats :
String : 89569ms
StringBuffer : 20ms
StringBuilder : 10ms
StringBuffer : 20ms
StringBuilder : 10ms
Comme on peut le constaster, il y a une énorme différence entre la classe String et les 2 suivantes ! Par contre, la différence entre le Buffer et le Builder est assez mince.
10 millisecondes pour concaténer 10000 fois le mot "liguorien". J'aimerais bien avoir des performances semblable en ActionScript...
(~2000ms)
Commentaires
1. Le vendredi 1 avril 2005 à 12:41, par xion
2. Le vendredi 1 avril 2005 à 13:04, par liguorien
3. Le vendredi 1 avril 2005 à 20:38, par kiroukou
4. Le mercredi 13 avril 2005 à 18:44, par SIfrit
5. Le mercredi 20 avril 2005 à 09:41, par xion
6. Le mercredi 20 avril 2005 à 10:05, par liguorien
7. Le mercredi 20 avril 2005 à 14:27, par liguorien
8. Le jeudi 21 avril 2005 à 06:10, par UrukHai
9. Le samedi 23 avril 2005 à 16:42, par xion
10. Le mardi 9 mai 2006 à 11:13, par ako
11. Le mardi 9 mai 2006 à 11:17, par liguorien
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.