english | блог | контакт
Thu, 16 May 2013 @ 16:40

Date object reuse vs new instance creation

Теги: java premature optimization

Вкратце:
new Date(...) работает практически в 2 раза быстрее, чем reusableDateObject.setTime(...) при условии, что объект никуда не уходит из метода (jdk1.7.0_17, core i5-2430m, 1g heap, pargc).
Но картина резко меняется, если хранить объект между вызовами метода.

import java.util.Date;

public class DateReuse {
  interface Test {
    void run();
  }
  static void bench(String name, Test test, int times) {
    long s = System.currentTimeMillis();
    for (int i = 0; i < times; i++) {
      test.run();
    }
    System.out.println(name + ":\n" + (System.currentTimeMillis() - s));
  }
  public static void main(String[] args) {
    bench("new instance on stack", new Test() {
      long a;
      public void run() {
        Date d;
        for (long l = 0; l < 10000000; l++) {
          d = new Date(l);
          a += d.getTime();
        }
      }
    }, 100);
    bench("reuse", new Test() {
      long a;
      public void run() {
        Date d = new Date();
        for (long l = 0; l < 10000000; l++) {
          d.setTime(l);
          a += d.getTime();
        }
      }
    }, 100);
    bench("new instance in field", new Test() {
      Date d;
      long a;
      public void run() {
        for (long l = 0; l < 10000000; l++) {
          d = new Date(l);
          a += d.getTime();
        }
      }
    }, 100);
    bench("reuse in field", new Test() {
      long a;
      Date d = new Date();
      public void run() {
        for (long l = 0; l < 10000000; l++) {
          d.setTime(l);
          a += d.getTime();
        }
      }
    }, 100);
  }
}