2017-02-21 34 views
0

Все примеры говорят, что это поточно и есть примеры, как это:Создает com.rits.cloning.Cloner дорого?

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

В моем коде я делаю только что: Создание нового каждый раз, когда я клонировать. Таким образом, вопросы: это и дорогой объект, который должен был создать один раз и повторно использовать или сделать новый ОК?

ответ

0

С помощью этого теста:

@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"); 
    } 

С результатами Calander:

  • общее время для нового каждый раз, когда: [644] мс
  • общее время для повторного использования одного: [39] мс

И с использованием нашего комплексного объекта:

  • общее время для нового каждый раз, когда: [9585] мс
  • общее время для повторного использования одного: [416] мс

И только с использованием 1 объекта и с помощью «из таймера» Cloner:

  • общее время для нового каждый раз, когда: [13] мс
  • общее время для повторного использования одного: [0] мс

Итак, я пришел к выводу, что, хотя и не так много времени, и поскольку это Threadsafe, полезно сделать это один раз и повторно использовать его.

+0

В качестве побочного комментария попробуйте использовать System.nanoTime() для измерения прошедшего времени. Это таймер, а currentTimeMillis() - скорее часы. Почему это может иметь значение: https://stackoverflow.com/a/351571 –