2010-08-15 4 views
-5

Mon expérience montre que la création d'objets en Java est très lente. Souvent, j'optimise mon code en supprimant simplement la création d'objets et en utilisant les mêmes objets plusieurs fois. Je me demande si c'est aussi lent dans l'autre langue avec la base de POO, parce que, pour moi, il est très contre-intuitif qu'un langage qui est orienté objet hardcore, prend beaucoup de temps pour la création d'objets.La création d'objets en Java est lente

Quelqu'un at-il profilé cela sur plusieurs langauges?

+0

Certains exemples de code seraient agréables. –

+0

J'utilise un MacBook Pro avec Core 2 Duo, 2,3 GHz, 2 Go de RAM. J'ai posté cela comme une observation générale dans plusieurs projets. Si vous n'avez pas fait face à ce problème, j'attendrais ceux qui l'ont fait. :) – euphoria83

+0

Peut-être nous dire quel genre d'objets ce sont des pojos simples? Objets graphiques lourds? autre chose ? – nos

Répondre

17

Essayez de voir ce que vous obtenez de - certains exercices pour essayer d'obtenir la machine virtuelle pour ne pas optimiser la boucle loin:

import java.util.ArrayList; 
import java.util.Random; 

class DummyInteger { 
    private int i; 
    public DummyInteger(int i) { 
     this.i = i; 
    } 
    public int getI() { 
     return i; 
    } 
} 

public class ObjectCreationTest { 

    final static int ITERATIONS = 2000000; 
    public static void main(String[] args) { 
     Random r = new Random(System.currentTimeMillis()); 

     int[] randArr = new int[ITERATIONS]; 
     for(int i = 0; i < ITERATIONS; i++) { 
      randArr[i] = r.nextInt(); 
     } 
     DummyInteger[] iArr = new DummyInteger[ITERATIONS]; 
     long start = System.currentTimeMillis(); 
     for(int i = 0; i < ITERATIONS; i++) { 
      ArrayList<DummyInteger> list = new ArrayList<DummyInteger>(); 
      list.add(new DummyInteger(randArr[i])); 
      iArr[i] = list.get(0); 
     } 
     long end = System.currentTimeMillis(); 
     System.out.println(String.format("Creating %d objects took %d ms",ITERATIONS*2,end-start)); 
     int sum = 0; 
     for(DummyInteger mi: iArr) { 
      sum += mi.getI(); 
     } 
     System.out.println(sum); 
     } 
} 

Je suis

Création 4000000 objets ont 678 ms

Ce qui devrait être d'environ 170 nanosecondes par objet.

+0

J'ai remplacé les tableaux par des tableaux de taille 8, en conservant les mêmes ITERATIONS et en utilisant '% 8' dans les expressions d'index. Puis déplacé le code dans une méthode que j'ai appelé un certain nombre de fois. Cela m'a donné un temps asymptotique de 97 ms pour créer 400 000 objets. C'est 24 nanosecondes par objet. –

+0

Gardez également à l'esprit que chaque instance de ArrayList contient effectivement un objet [], donc nous créons réellement 3 objets par itération. –

+0

Je crois que la raison de l'accélération lorsque je réduis la taille de la matrice est que nous avons * considérablement * réduit le nombre d'objets que le GC doit tracer. En d'autres termes, la plupart du temps, dans l'indice de référence initial, fonctionnait le GC ... et ce n'est clairement pas ce que nous essayions de mesurer. Les micro-benchmarks Java sont DIFFICILES pour bien faire !!! –

9

Bien qu'il puisse y avoir un noticeable CPU impact dans de rares circonstances, en général, la création d'objets pour les machines virtuelles actuelles est aussi rapide que possible.

Here est un article que j'aime appelé "Urban performance legends", je pense que c'est juste un de ces mythes.

Jetez également un coup d'œil à http://www.javaperformancetuning.com/tips/rawtips.shtml pour découvrir comment optimiser les performances de votre application Java.

Cordialement.

+0

Nous vous remercions du lien Légendes Performance urbaine. J'ai aussi entendu le mantra "création d'objet est lent" en Java lors de mon premier emploi en 2007 ... et cela m'a collé. –

Questions connexes