-1

私のプロジェクトでは、スクリプトから大量の関数をコレクションにロードして、それらを保持し、スクリプトを再度読み取らずに後で (おそらく何度も) 実行したいと考えています。関数へのアクセスをできるだけ高速にする必要があり、そのための 2 つの方法を考えました。

  1. コマンド パターン: 最初のアイデアは、スクリプト コマンドをオブジェクト (コマンド パターン) としてコレクション内に保存し、スクリプトを実行する必要があるときに for-each-loop 内でそれらすべてを実行することでした。コードは読みやすくなりますが、オブジェクトを介してすべての異なるコマンドにアクセスするには、多くのパフォーマンスとメモリが必要になると思います。

    for (Command command : commandList) { command.execute();

  2. char のコレクションとケースの切り替え: 私の 2 番目のアイデアは、char や int などのプリミティブ変数をコレクションに格納し、ケースの切り替え構造を for-each ループ内に配置することでした。プリミティブを使用するのは、String オブジェクトよりも速いと思うからです。したがって、Trove のようなライブラリを使用します。コマンドオブジェクトにアクセスする必要がないため、この方法はコマンドパターンよりも高速になる可能性があると思います。さらに、占有されるメモリが少なくなります。一方、コマンドパターンは適切な関数に直接アクセスできるのに対し、switch-case コンストラクトは文字が a、b、c、d などであるかどうかを何度もチェックする必要があるため、遅くなる可能性があると思います。

    for (char command : commandList) { switch(command){ case 'a': doA(); break; case 'b': doB(); break; case 'c': ... } }

片道の方が良いと思いますか?別の方法を知っていますか?どのタイプのコレクションをお勧めしますか?

4

2 に答える 2

2

あなたの質問は次のようになります:ポリモーフィズムとスイッチステートメント。

前者は、何が起こっているのかを知りたいときやそれに追加したいときはいつでも、マジックナンバーをキー(またはあなたの場合は文字)として使用して大きなswitchステートメントをスラッグする必要がないため、保守性と可読性に優れています。

パフォーマンスに関しては、どちらも非常に一般的で単純なケースであるため、無視して高度に最適化する必要があります。したがって、最適化よりも可読性/保守性を心配する方がよいため、ポリモーフィズムの方が優れています。

于 2014-07-25T12:32:17.283 に答える
0

2番目のアプローチの方が良いと思います。

一方、コマンドパターンは適切な関数に直接アクセスできるのに対し、switch-case コンストラクトは文字が a、b、c、d などであるかどうかを何度もチェックする必要があるため、遅くなる可能性があると思います。

コンパイラはそれを処理して最適化します。スクリプト ファイルのサイズが GB 単位でなくても問題ありません。

于 2014-07-25T12:24:49.800 に答える