2010-12-27 13 views
21

SimpleDateFormatのパフォーマンスとスレッドの問題についてよく知っているので、FastDateFormatは構文解析のみを行うことに気付くまで、FastDateFormatに行くことにしました。効率的な日付解析のためのFastDateFormatに代わるものはありますか?

FastDateFormatの代替品があります。すぐに使用できる状態で、SimpleDateFormatよりもはるかに高速ですか?

私はFastDateFormatが速いものの1つだと信じていますので、それほど速いものはありません。

なぜ、FastDateFormatが解析をサポートしていないのですか?それは真剣にその使用を制限していないのですか?

+4

注:lang 3.2以降、この質問と回答は廃止されました。 – Barett

答えて

18

最高の推測では、FastDateFormatを表示するように制限することで、高速にすることができます。

Apache Commons DateUtilsにはparseDateという機能がありますが、内部でSimpleDateFormatを使用しています。

代替方法は、JodaTimeライブラリを使用することです。これは、DateFormatDate、およびCalendarオブジェクトを扱うための完全な置き換えです。

JodaTimeには、文字列からDateTimeオブジェクト(JodaTimeのJavaのDateオブジェクトに相当)を作成するために使用できるDateTimeFormatterがあります。

それを使用する方法の例は次のようにされています。これはどの速くSimpleDateFormatよりも実際にある場合

String strInputDateTime = "2010-12-27"; // An example, this would really come from outside 
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd"); 
DateTime dt = fmt.parseDateTime(strInputDateTime); 

でも、私は知りません。

+4

注:lang 3.2以降、この質問と回答は廃止されました。 – Barett

+0

それは寛大であるか*寛大ではありませんか? –

1

本当に日付をすばやく解析する必要がありますか?あなたはSimpleDateFormatをテストしましたが、それがあなたのニーズには遅すぎると感じましたか?

スロー・ツー・コンストラクションでスレッドセーフではないクラス・インスタンス(ThreadLocal、プールなど)をキャッシュするには、さまざまな方法があります。

+0

私は、プールやマルチスレッドを含むいくつかの手法があることを認識していますが、私は何かを棚から探しています。 –

+0

私の他の質問はどうですか? SimpleDateFormatがあなたのニーズには遅すぎることを確認しましたか? – jtahlborn

+0

ThreadLocalの+1と「ここで実際にパフォーマンスが必要ですか?」 –

2

SimpleDateFormatの「問題」は、パフォーマンス、スレッドの安全性ではありません。

あなたがスレッドと同期の数千人を持っている場合は、同期の問題を使用していない(あなたも、この小さなを軽減するためにインスタンスをプールすることができます)

あなたがスレッドの合理的な金額を持っている場合は推奨される方法が持っていることですSimpleDateFormatごとに別々のインスタンス

+0

SimpleDateFormatはスレッドセーフではないため、新しいインスタンスを作成するか、共有インスタンスへの同時アクセスを同期する必要があります。いずれにしてもかなり遅いです。それは私がパフォーマンスの問題を意味するものです。 –

+0

あなたの状況にもよりますが、スレッドセーフなバージョンが必要な場合は、各スレッドの最初に新しいインスタンスを作成し、そのスレッド内で同じものを再利用することができます。数千のスレッドが初期化されている場合、実際のSimpleDateFormatオブジェクトインスタンスを作成するよりも、スレッドを作成するオーバーヘッドがはるかに高くなります。 – jbx

+0

Simple:SimpleDateFormatで常にThreadLocalを使用してください。 (http://download.oracle.com/javase/6/docs/api/java/lang/ThreadLocal.html) –

9

は、Androidでこの例ここで何か面白いものを発見: http://andmob.wikidot.com/faq-simpletimeformat

のSimpleDateFormat、あなたがパースしてみてください 初めて(おそらく、または、 フォーマット)の日付を、タイムゾーンデータすべて を中にロードしますあなたのロケールのために。 これには2〜3秒かかります。これは で、これは一部の Androidの将来版で修正されることが期待されています。暫定で

、あなたがそれを必要とする前に、あなたのプロセス で てSimpleDateFormatを「ウォームアップ」する AsyncTaskを使用することを検討してください。 AsyncTask doInBackground() にある の日付を解析して、 ユーザにそれほど影響しない場合はいつでも、タイムゾーン をロードするようにしてください。 プロセスで初期化されると、プロセスが 終了するまで、SimpleDateFormatはすぐに を実行します。

+3

それはinteressting、+1です!しかし、この問題は、Android固有のもので、トピックから少し外れているのですか? –

19

Commons-lang 3.2以降、FastDateFormatは解析と印刷をサポートしています。

を参照してください:Javaの8のようhttp://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/FastDateFormat.html

+0

驚きの驚き、ApacheはFastDateParserも解析しています – ahaaman

+1

解析では大文字と小文字が区別されることがわかりました。 (10月10日、10月10日)。このバグは3.4で修正されていますが、このコメントの時点では私は再償還されていないか、Mavenにはありません。それを楽しみにしています。 https://issues.apache.org/jira/browse/LANG-996 – borjab

+0

私は間違っているかもしれませんが、3.4の時点で、FastDateParserの_lenient_プロパティを** false **に設定する方法がないようです。 – ptha

5

、1は、解析およびフォーマットの日付の両方にJava 8 Time APIとともにDateTimeFormatterを使用することができます。ドキュメントから:

このクラスは不変でスレッドセーフです。

SimpleDateFormatを使用するのではなく、新しい作業を進めるために可能であれば、このクラスを使用することをお勧めします。

関連する問題