2017-02-21 455 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"); 
    } 

随着砑光机的结果:

  • 总时间对于每个时间新的:
  • 总时间重新使用一个[644] MS:[39]毫秒

并使用我们的复杂对象:

  • 总时间对于每个时间新的:
  • 总时间重用酮[9585] MS:[416] MS

而只使用1个对象,并使用 “超时计时器的” 克隆:

  • 总时间对于每个时间新的:[13] MS
  • 总时间重新使用一个:[0]毫秒

所以我得出这样的结论:虽然没有太多时间,并且由于它是Threadsafe,所以最好只做一次并重用它。

+0

作为一条评论,尝试使用System.nanoTime()来测量已用时间。这是一个计时器,currentTimeMillis()是一个时钟。 为什么这可能很重要:https://stackoverflow.com/a/351571 –