1

問題

パフォーマンスが非常に重要なアプリケーションを作成しています。(具体的には、レイトレーサー)

プログラムに「適応スーパーサンプリング」と呼ばれるもののオプションが必要です。実装はかなり簡単ですが、オンまたはオフにするオプションが必要です。

残念ながら、次の 2 つのオプションしか表示されません。

  1. 次のように、if/else を 2 つの別個の手順 (かなり似ています) に配置します。

    void renderLoop() {
        if(adaptive) {
            doAdaptiveLoop();
        } else {
            doNormalLoop();
        }
    }
    
  2. 特殊な if/else ステートメントをコードのあちこちに配置します。

    void renderLoop() {
        if(adaptive) something();
        else somethingElse();
    
        for(int i = 0; i < LOOP_1; i++) {
            if(adaptive) something1();
            else somethingElse1();
    
            for(int j = 0; j < LOOP_2, j++) {
                if(adaptive) something2();
                else somethingElse2();
            }
        }
        //... So on and so forth
    }
    

これらの方法はどちらもかなりひどいものです。方法 1 は多くのコードを繰り返しますが、方法 2 は面倒で非効率的です。どちらも、多くの機能を追加することを非常に困難にします。さらに機能を追加したい場合は、方法 1 では階乗率で if/else ステートメントを追加する必要があり、方法 2 では非常に紛らわしい方法で追加する必要があります。

質問

パフォーマンスに依存するアプリケーションでこの問題に何度も遭遇しましたが、実際に解決できたことはありません。

質問は次のとおりです: 多くのループを中心とするプログラムにトグル可能な機能を追加するにはどうすればよいですか? 多くのブール値テストでパフォーマンスが低下し、それらのテストでコードが乱雑になりますか?

4

3 に答える 3

1

私も定期的にこの問題に遭遇し、通常はオプション 1 と 2 のどちらかを選択する必要があります。オプションの数が増え続ける場合は、通常、スイス アーミー ナイフ方式であるコード生成に頼ります。

つまり、関数 B1、B2 などを記述するプログラム A を作成します。プログラム A はオプションを引数として取り、適切な関数 Bi をテキスト ファイルとして生成し、最終的なプログラムにはすべての Bi が含まれます。

それはきれいではありませんが、きれいは過大評価されています. 利点は、すべての Bi に共通するコードが 1 か所にしか記載されていないため、変更する場合は 1 か所で済むため、間違われる機会が少ないことです。

于 2013-08-19T12:48:25.973 に答える
0

おそらく、グローバル関数ポインター変数を使用して、オプションで使用するように指示されたループ関数を保持します。

于 2013-08-20T08:35:24.060 に答える