注:サンプルプログラムは非常にマイクロベンチマークであり、日付フォーマッタのコストを非常に効果的に最大限に増幅します。あなたは何もしないことと何かをすることを比較しています。したがって、それが何であれ、何もないよりも何倍も遅いように見えます。
このようなテストは非常に価値があり、非常に誤解を招きます。マイクロベンチマークは、通常、Teh Slow の実際のケースがある場合にのみ役立ちます。このベンチマークを 10 倍高速化したとしても (実際、以下で提案する方法でおそらく可能です)、実際のケースはアプリで使用される全体の CPU 時間の 1% にすぎない場合、最終結果は次のようにはなりません。劇的な速度の向上 - ほとんど目立たないでしょう。
そのような費用の理由は何ですか?
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyyMMdd HH:mm:ss.SSS"];
ほとんどの場合、コストは、日付形式文字列を解析/検証する必要があることと、あらゆる種類のロケール固有のグープを実行する必要があることの両方に関連してNSDateFormatter
います。Cocoa はローカリゼーションを非常に完全にサポートしていますが、そのサポートには複雑さが伴います。
かなり素晴らしいサンプル プログラムをどのように作成したかを見て、Instruments でアプリを起動し、さまざまな CPU サンプリング インストゥルメントを試して、何が CPU サイクルを消費しているのか、そして Instruments がどのように機能するのかを理解することができます (興味深いものが見つかったら、質問を更新してください!)。
スレッドが互いに待機しなければならない場所でブロッキングが発生する可能性はありますか?
複数のスレッドから単一のフォーマッタを使用しても、単純にクラッシュしないことに驚いています。 NSDateFormatter
スレッドセーフであることは特に言及していません。したがって、スレッドセーフではないと想定する必要があります。
使い勝手を良くするにはどうすればいいですか?
多くの日付フォーマッタを作成しないでください!
操作のバッチ用に 1 つ保持してから削除するか、常に使用する場合は、アプリの実行の開始時に 1 つ作成し、形式が変更されるまで保持します。
スレッド化の場合、本当に必要な場合は、スレッドごとに 1 つ保持します (これは過剰だと思います。アプリのアーキテクチャは、操作のバッチごとに 1 つ作成する方が賢明です)。