1

问题

我正在编写一个性能非常重要的应用程序。(特别是:光线追踪器)

我想在我的程序中有一个名为“自适应超级采样”的选项。实现起来相当简单,但我想有一个选项来打开或关闭它。

不幸的是,我只看到两个选项,它们是:

  1. 将 if/else 放在两个单独的过程(非常相似)周围,如下所示:

    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 中以阶乘率添加更多 if/else 语句,而在方法 2 中以非常混乱的方式添加。

问题

我在性能相关的应用程序中多次遇到这个问题,但我从来没有真正能够解决它。

问题是:如何向我的程序添加可切换的功能,该程序以许多循环为中心,其性能会因许多布尔测试而降低,并且其代码会因这些测试而变得混乱?

4

3 回答 3

1

我也经常遇到这个问题,我通常不得不在选项 1 和 2 之间进行选择。如果选项的数量不断增加,我通常会求助于瑞士军刀方法:代码生成。

换句话说,我编写程序 A 来编写函数 B1、B2 等。程序 A 将选项作为参数并生成适当的函数 Bi 作为文本文件,然后最终程序包含所有 Bi。

它不漂亮,但漂亮被高估了。好处是,所有Bi中的通用代码只写在一处,所以如果你修改它,你只需要在一处做,这样你出错的机会就更少了。

于 2013-08-19T12:48:25.973 回答
1

我认为您正在寻找的是函数指针或类似的东西。

让我详细说明一下,您特别要求性能,并且我同意追逐指针可能会妨碍您-但是由于您现在似乎有大量分支,具体取决于应用程序内部某处的设置,您不妨将该代码包装起来在一些函数指针中。这并不意味着您应该在添加两个向量时通过指针调用函数。

附带说明;这在并行化代码时也很重要;工作项不必太大以减轻并行化工作,但需要足够大以有效处理。

于 2013-08-20T20:00:02.777 回答
0

也许使用全局函数指针变量来保存您的选项告诉您使用的循环函数。

于 2013-08-20T08:35:24.060 回答