Javaでは、使用することでパフォーマンスとリソースにどのような影響がありますか
System.currentTimeMillis()
対
new Date()
対
Calendar.getInstance().getTime()
私が理解しているように、System.currentTimeMillis()が最も効率的です。しかし、ほとんどのアプリケーションでは、人間にとって意味のあることをするためには、その長い値をDateなどのオブジェクトに変換する必要があります。
System.currentTimeMillis()
明らかに最も多い効率的オブジェクトを作成することすらないのでnew Date()
これは実際には長さの薄いラッパーにすぎないので、それほど遅れているわけではありません。Calendar
一方、日付と時刻(うるう年、夏時間、タイムゾーンなど)に固有のかなり複雑なものとすべての奇妙な問題に対処する必要があるため、比較的低速で非常に複雑です。
一般的に、長いタイムスタンプだけを扱うことをお勧めします。Date
アプリケーション内のオブジェクトはCalendar
実際に日付/時刻の計算を実行したり、ユーザーに表示するために日付をフォーマットしたりする必要があるとき。あなたがこれの多くをしなければならないならば、使用してジョダ時差よりきれいなインターフェースとより良いパフォーマンスのために、おそらく良い考えです。
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自身のカレンダー/日付クラスの代わりとして使うために。
あなたが日付を使っているならば、私はあなたがjodatimeを使うことを強く勧めます、http://joda-time.sourceforge.net/。を使うSystem.currentTimeMillis()
その分野のためにあります日付は非常に悪い考えのように思えます。なぜなら、あなたは結局無駄なコードがたくさんあることになるからです。
日付とカレンダーの両方がひどく混乱しています、そしてカレンダーは間違いなくそれらすべての最も悪い実行者です。
私はあなたに使うように忠告しますSystem.currentTimeMillis()
あなたが実際にミリ秒で操作している時、例えばこんな感じ
long start = System.currentTimeMillis();
.... do something ...
long elapsed = System.currentTimeMillis() -start;
で返される値を使うのが好きです。System.currentTimeMillis()
あらゆる種類の計算に使用Calendar
またはDate
私が本当に人間によって読まれる値を表示する必要があるならば。これはまたあなたの夏時間のバグの99%を防ぐでしょう。 :)
私のマシンで私はそれをチェックしてみました。私の結果:
Calendar.getInstance().getTime() (*1000000 times) = 402ms new Date().getTime(); (*1000000 times) = 18ms System.currentTimeMillis() (*1000000 times) = 16ms
GCを忘れないでください。Calendar.getInstance()
またはnew Date()
)
アプリケーションによっては、使用を検討してください。System.nanoTime()
代わりに。
nanoTime
戻り値は相対的で(通常はプログラムの開始位置を基準としています)、日付に変換しようとすると意味がありません。 - Dunes
私はこれを試しました:
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
System.currentTimeMillis()
メソッド呼び出しは1つしかなく、ガベージコレクタは必要ないため、これは明らかに最速です。