0

コンパイル時に Map または Set 型のデータ構造を作成する方法はありますか?

私がこれを尋ねる理由は、私は App Engine で作業しており、並べ替えと検索が必要なデータ構造がいくつかあるためですが、それらは一定であるため、開始時にそれらを作成する時間コストを避けたいと考えています-上。

4

4 に答える 4

3

あらゆる種類のパフォーマンスの最適化と同様に、最初に自問することは、実行時にこれらの構造を設定するのにかかる時間が実際にパフォーマンスに影響を与えているかどうかです。あなたの構造物の面積はどのくらいですか?セットアップにはどのくらい時間がかかりますか? これを測定していない場合は、時期尚早の最適化に取り組んでいることがわかります。これはすべての悪の根源です。

これを行ったと仮定して、オプションを見てみましょう。実際にどれくらいの時間を節約できますか? あなたの最善の策は、何らかの形式のシリアライゼーションを使用することですが、それを自分で作成する必要があります。コンテンツを保持するファイル形式を定義したとしても、ファイルを解析する必要があり、メモリ内データ構造を作成する必要があります。これには時間がかかります。また、マップまたはセットを作成してデータを入力するよりも大幅に高速になる可能性は低いです。一部の言語では、理論的にはこれらの構造体のメモリのビット パターンを保存できますが、それができたとしても、コンパイラ バージョンの小さな変更に対して脆弱になり、発生したエラーをデバッグすることは事実上不可能になります。

要するに、必要であることが確実でない限り、これを行わないでください。それでも、おそらくこれを行うべきではありません。(おそらく非常に小さい) 時間の節約が、プロジェクトの成功と失敗の違いを完全に意味する場合にのみ、使用する必要があります。

于 2010-11-02T15:52:59.613 に答える
2

Spring を使用している場合は、構成でこれらのデータ構造を作成して入力し、キャッシュすることができますが、実行時にそれらを作成して入力することを回避する方法がわかりません。いつかそのコードを実行する必要があります。私には時期尚早の最適化のように聞こえます。

于 2010-11-02T15:34:31.063 に答える
1

いいえ; すべてのオブジェクトの作成は常に実行時に行われます。

そうは言っても、次のようにセットを一緒に宣言して初期化することができます。

private static Set<String> set = new HashSet<String>(Arrays.asList("abc", "def"));

ただし、これは実行時に実行されます。

マップを処理するには、代わりに静的初期化子を使用する必要があります。

于 2010-11-02T15:47:12.243 に答える
1

コンパイル時には、私はそれが可能だとは思わない。実行時は可能です。あなたの最善の解決策は、アプリエンジンを使用し、おそらくcronジョブトリックを使用してホットなcronジョブリンクを維持することです

次に、アプリケーションの最初の実行時にキャッシュされるコードの静的ブロックでリストを定義できます

例えば

private static List<Object> list = new ArrayList<Object>();

static {
    for(Value value : getValues()){
        list.add(value);
    }
}

オブジェクトの作成時に実行される @PostConstruct でメソッドにアノテーションを付けることで、同じことを非静的環境で行うことができるように、ポスト コンストラクトのスプリング アノテーションも参照してください。

于 2010-11-02T15:40:54.703 に答える