web-dev-qa-db-ja.com

System.currentTimeMillis()vs.新しいDate()vs. Calendar.getInstance()。getTime()

Javaでは、使用することのパフォーマンスとリソースの意味は何ですか

System.currentTimeMillis() 

vs.

new Date() 

vs.

Calendar.getInstance().getTime()

私の理解では、System.currentTimeMillis()が最も効率的です。ただし、ほとんどのアプリケーションでは、人間にとって意味のあることを行うには、その長い値をDateまたは同様のオブジェクトに変換する必要があります。

224
Vihung

System.currentTimeMillis()は、オブジェクトを作成することさえしないため、明らかに最も効率的です。しかし、new Date()は、実際には、ほんの少し長いラッパーです。後ろに。一方、Calendarは、比較的複雑で、日付と時刻(うるう年、夏時間、タイムゾーンなど)に固有のすべての奇妙なことに対処する必要があるため、比較的低速で非常に複雑です。

通常、アプリケーション内で長いタイムスタンプまたはDateオブジェクトのみを処理し、実際に日付/時刻の計算を実行する必要がある場合にのみCalendarを使用するか、ユーザーに表示する日付をフォーマットすることをお勧めします。これを多く行う必要がある場合は、 Joda Time を使用することをお勧めします。これは、よりクリーンなインターフェイスとパフォーマンスの向上のためです。

226

JDKを見ると、Calendar.getInstance()の最も内側のコンストラクタには次のものがあります。

public GregorianCalendar(TimeZone zone, Locale aLocale) {
    super(zone, aLocale);
    gdate = (BaseCalendar.Date) gcal.newCalendarDate(zone);
    setTimeInMillis(System.currentTimeMillis());
}

そのため、既に提案されていることは自動的に実行されます。日付のデフォルトコンストラクターはこれを保持します。

public Date() {
    this(System.currentTimeMillis());
}

そのため、カレンダー/日付オブジェクトを作成する前に数学を実行する場合を除き、特にシステム時間を取得する必要はありません。また、日付の計算を頻繁に行うことが目的の場合、Javaのカレンダー/日付クラスの代わりとして使用するために joda-time を推奨する必要があります。

41
Esko

日付を使用している場合は、jodatime、 http://joda-time.sourceforge.net/ を使用することを強くお勧めします。 are日付のフィールドにSystem.currentTimeMillis()を使用することは、多くの無駄なコードになってしまうため、非常に悪い考えのように聞こえます。

日付とカレンダーはどちらも真剣に取り残されており、カレンダーは間違いなくそれらすべての中で最悪のパフォーマンスを発揮します。

実際にミリ秒単位で操作している場合は、System.currentTimeMillis()を使用することをお勧めします

 long start = System.currentTimeMillis();
    .... do something ...
 long elapsed = System.currentTimeMillis() -start;
22
krosenvold

私のマシンでチェックしてみました。私の結果:

 Calendar.getInstance()。getTime()(* 1000000 times)= 402ms 
 new Date()。getTime(); (* 1000000回)= 18ms 
 System.currentTimeMillis()(* 1000000回)= 16ms 

GCを忘れないでください(Calendar.getInstance()またはnew Date()を使用する場合)

12
Puzirki

すべての種類の計算にSystem.currentTimeMillis()によって返される値を使用することを好み、人間が読み取った値を実際に表示する必要がある場合にのみCalendarまたはDateを使用します。これにより、夏時間のバグの99%も防止されます。 :)

12
Bombe

アプリケーションによっては、代わりにSystem.nanoTime()の使用を検討することもできます。

7
MykennaC

私はこれを試しました:

        long now = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            new Date().getTime();
        }
        long result = System.currentTimeMillis() - now;

        System.out.println("Date(): " + result);

        now = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            System.currentTimeMillis();
        }
        result = System.currentTimeMillis() - now;

        System.out.println("currentTimeMillis(): " + result);

結果は:

Date():199

currentTimeMillis():3

3
wiji

System.currentTimeMillis()は、メソッド呼び出しが1つだけで、ガベージコレクターが不要なため、明らかに最速です。

0
Ramón