Javaでは、使用することのパフォーマンスとリソースの意味は何ですか
System.currentTimeMillis()
vs.
new Date()
vs.
Calendar.getInstance().getTime()
私の理解では、System.currentTimeMillis()が最も効率的です。ただし、ほとんどのアプリケーションでは、人間にとって意味のあることを行うには、その長い値をDateまたは同様のオブジェクトに変換する必要があります。
System.currentTimeMillis()
は、オブジェクトを作成することさえしないため、明らかに最も効率的です。しかし、new Date()
は、実際には、ほんの少し長いラッパーです。後ろに。一方、Calendar
は、比較的複雑で、日付と時刻(うるう年、夏時間、タイムゾーンなど)に固有のすべての奇妙なことに対処する必要があるため、比較的低速で非常に複雑です。
通常、アプリケーション内で長いタイムスタンプまたはDate
オブジェクトのみを処理し、実際に日付/時刻の計算を実行する必要がある場合にのみCalendar
を使用するか、ユーザーに表示する日付をフォーマットすることをお勧めします。これを多く行う必要がある場合は、 Joda Time を使用することをお勧めします。これは、よりクリーンなインターフェイスとパフォーマンスの向上のためです。
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 を推奨する必要があります。
日付を使用している場合は、jodatime、 http://joda-time.sourceforge.net/ を使用することを強くお勧めします。 are日付のフィールドにSystem.currentTimeMillis()
を使用することは、多くの無駄なコードになってしまうため、非常に悪い考えのように聞こえます。
日付とカレンダーはどちらも真剣に取り残されており、カレンダーは間違いなくそれらすべての中で最悪のパフォーマンスを発揮します。
実際にミリ秒単位で操作している場合は、System.currentTimeMillis()
を使用することをお勧めします
long start = System.currentTimeMillis();
.... do something ...
long elapsed = System.currentTimeMillis() -start;
私のマシンでチェックしてみました。私の結果:
Calendar.getInstance()。getTime()(* 1000000 times)= 402ms new Date()。getTime(); (* 1000000回)= 18ms System.currentTimeMillis()(* 1000000回)= 16ms
GCを忘れないでください(Calendar.getInstance()
またはnew Date()
を使用する場合)
すべての種類の計算にSystem.currentTimeMillis()
によって返される値を使用することを好み、人間が読み取った値を実際に表示する必要がある場合にのみCalendar
またはDate
を使用します。これにより、夏時間のバグの99%も防止されます。 :)
アプリケーションによっては、代わりにSystem.nanoTime()
の使用を検討することもできます。
私はこれを試しました:
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
System.currentTimeMillis()
は、メソッド呼び出しが1つだけで、ガベージコレクターが不要なため、明らかに最速です。