256

Java では、使用のパフォーマンスとリソースへの影響は何ですか?

System.currentTimeMillis() 

対。

new Date() 

対。

Calendar.getInstance().getTime()

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

4

8 に答える 8

262

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

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

于 2008-12-15T11:53:14.880 に答える
45

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

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

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

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

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

于 2008-12-15T11:44:32.090 に答える
22

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

日付とカレンダーの両方が深刻な問題を抱えており、カレンダーは間違いなくそれらすべての中で最悪のパフォーマンスです.

System.currentTimeMillis()たとえば、次のように、実際にミリ秒で操作しているときに使用することをお勧めします

 long start = System.currentTimeMillis();
    .... do something ...
 long elapsed = System.currentTimeMillis() -start;
于 2008-12-15T11:40:48.790 に答える
12

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

于 2008-12-15T11:39:59.103 に答える
7

Depending on your application, you may want to consider using System.nanoTime() instead.

于 2008-12-15T22:10:19.863 に答える
3

私はこれを試しました:

        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);

結果は次のとおりです。

日付(): 199

currentTimeMillis(): 3

于 2014-01-24T17:12:18.327 に答える
0

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

于 2014-01-24T17:18:36.407 に答える