2012-02-23 6 views
3

私は本当にSimpleDateFormatに代わるものが必要です。多くのStrig日付(> 100k)をJSTからGMTに変換しています。私が持っている問題は、プロファイリング中に気付いたように、私のコードが多くのchar []への道を生成することです。 150kの日付では、150MBのメモリが使用されています。ありがとう。日付解析のためのSimpleDateFormatに代わるもの

SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); 
    sdf.setTimeZone(tz); 
    try { 
     Date theResult = sdf.parse(dateToConvert); 
     SimpleDateFormat rdf = new SimpleDateFormat(resultDateFormat); 
     rdf.setTimeZone(resultTz); 
     return rdf.format(theResult); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

私はジョーダン時間を使用することができないため、私の選択肢ではありません。 :(

出発点として
+1

ループはどこですか? –

+1

JODA時間の使用を検討すると、パフォーマンスが向上する場合があります。 –

+3

SimpleDateFormatsをキャッシュするとどうなりますか?スレッドセーフではないので、スレッドごとにキャッシュが必要です。 –

答えて

1

SimpleDateFormatが日付の解析に非効率的であると思われる特別な理由はありますか?日付が特定の最適化に役立つ非常に特殊な特性を持っていない限り、JDKクラスはジョブをそれの。

これは、あなたの日付がすべて(100万とは考えにくい)ではないことを前提として、Stringが渡され、Dateが出ているマップをキャッシュに入れることができます。これにより、必要な解析の量が大幅に削減されます。既存の特性に依存して、顕著なスピードアップ/メモリゲインをもたらすことも、しないこともあります。

2つの新しいSimpleDateFormatsを作成するたびに、非常にとなる可能性があります。クラスがロードされたときに一度これらのインスタンスを作成しないでください(フォーマットが行単位で変更されない限り)。 SDFの内部が最初の実行で多くのchar[]割り当てを含むようなものである場合、これはあなた自身の問題を解決するかもしれません。 (ただし、奇妙な日付形式はスレッドセーフではないので、解析クラスを同時に使用する場合はThreadLocal<DateFormat>が必要です)。

+0

すべての日付が異なります。私はあなたの2番目の提案を試みます。ありがとう。 – CristiL

4

、私はそれらのSimpleDateFormatのインスタンスを再利用したいのではなく、あなたが変換する必要があり、それぞれの日付のためにそれらのペアを再作成する。

+6

SimpleDateFormatはスレッドセーフではないため、慎重に行う必要があります(http://stackoverflow.com/questions/6840803/simpledateformat-thread-safety) –

9

利用ジョダ時

org.joda.time.format.DateTimeFormatter dtf = 
     org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd"); 
    org.joda.time.DateTime date = dtf.parseDateTime(yourDate); // String like 2000-12-12 
    date.withZone(yourZone); // org.joda.time.DateTimeZone 
3

はい、joda時間は本当にいいAPI​​ですが、user1143825は入力timeZoneを設定するのを忘れています。 メモリのパフォーマンスについては言えませんが、テストして結果を比較する必要があります。

これは動作するはずです:

DateTimeFormatter sdf = DateTimeFormat.forPattern(dateFormat).withZone(tz); 
try { 
    DateTime theResult = sdf.parseDateTime(dateToConvert).withZone(resultTz) 
    return theResult; 
} catch (IllegalArgumentException e) { 
    e.printStackTrace(); 
} 
2

javaの

  sample time format //31/Mar/2013:16:59:30 -0700 
      Date date = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss Z").parse(yourTIME); 
      String time= new SimpleDateFormat("dd/MMM/yyyy, HH:mm").format(date); 

を使用してジョダライブラリ時間変換に使用

このライブラリには、私のコードの速度性能向上し
  org.joda.time.format.DateTimeFormatter tf=org.joda.time.format.DateTimeFormat.forPattern("dd/MMM/yyyy:HH:mm:ss Z"); 
     org.joda.time.DateTime date = dtf.parseDateTime(time); 
     String time=date.toString("dd/MMM/yyyy, HH:mm")); 

Javaコードを使用する14991 ms jodaライブラリを使用する1668 ms

関連する問題