2017-02-21 4 views
0

die Beispiele sagen, es THREAD ist und haben Beispiele wie folgt aus:Ist das Erstellen eines com.rits.cloning.Cloner teuer? Alle

Cloner cloner=new Cloner(); 
MyClass clone=cloner.deepClone(o); 

In meinem Code ich tue genau das: Erstellen eines neuen jedes Mal, wenn ich klonen. Die Frage ist also: Ist das ein teures Objekt, das einmal erstellt und wiederverwendet werden sollte oder ein neues macht?

Antwort

0

Mit diesem Test:

@Test 
    public void loadTestCloner() { 
     Calendar cal = GregorianCalendar.getInstance(); 

     long timer = System.currentTimeMillis(); 
     for (int i = 0; i < 100000; i++) { 
      Cloner c1 = new Cloner(); 
      Calendar x = c1.deepClone(cal); 
     } 
     System.out.println("total time for new one each time: [" + (System.currentTimeMillis() - timer) + "]ms"); 

     long timer2 = System.currentTimeMillis(); 
     Cloner c2 = new Cloner(); 
     for (int i = 0; i < 100000; i++) { 
      Calendar x = c2.deepClone(cal); 
     } 
     System.out.println("total time for reused one: [" + (System.currentTimeMillis() - timer2) + "]ms"); 
    } 

Mit Calander Ergebnisse:

  • Gesamtzeit für neue jedes Mal: ​​[644] ms
  • Gesamtzeit für wiederverwendet ein: [39] ms

Und mit unserem komplexen Objekt:

  • Gesamtzeit für neue jedes Mal: ​​[9585] ms
  • Gesamtzeit für wiederverwendet ein: [416] ms

Und nur mit 1 Objekt und mit einem "out of timer" Cloner:

  • Gesamtzeit für neue jedes Mal: ​​[13] ms
  • Gesamtzeit für eine wieder verwendet: [0] ms

Also ich folge, dass, obwohl nicht viel Zeit, und da es Threadssafe ist, es gut ist, dies einmal zu machen und es wieder zu verwenden.

+0

Als Nebenkommentar verwenden Sie System.nanoTime() zum Messen der verstrichenen Zeit. Es ist ein Timer, und currentTimeMillis() ist eher eine Uhr. Warum dies von Bedeutung sein kann: https://stackoverflow.com/a/351571 –

Verwandte Themen