在这种情况下如何在不违反DRY(不重复自己)原则的情况下优化性能?

时间:2010-11-24 10:50:37

标签: performance dry

假设我正在使用C ++。现在我有以下代码:

int flag;
// ...
while (!TimeToExitLoop()) {
    Func();
}

while循环将执行很多次,而Func是一个时间要求严格的函数,如下所示:

void Func() {
    // some big stuff ...
    if (flag > 1) {
        // logic 1 ...
    }
    else {
        // logic 2 ...
    }
}

此外,flag循环中while的值不会发生变化。因此,最好将条件if语句移出while循环,并为这两个条件定义两个单独的函数:

int flag;
// ...
if (flag > 1) {
    while (!TimeToExitLoop()) {
        Func_FlagBiggerThanOne();
    }
}
else {
    while (!TimeToExitLoop()) {
        Func_FlagNoBiggerThanOne();
    }
}

然而,这会导致FuncFunc_FlagBiggerThanOne重复Func_FlagNoBiggerThanOne中的“大事”:

void Func_FlagBiggerThanOne() {
    // big stuff ...
    // logic 1 ...
}

void Func_FlagNoBiggerThanOne() {
    // big stuff ...
    // logic 2 ...
}

这将违反不要重复自己的原则。我们不能在某些函数中添加“大东西”,因为调用该函数比原始if语句更耗时。其中一个解决方案是为那些大的东西定义一个宏,但是如果“逻辑1”和“逻辑2”将使用“大东西”中定义的变量呢?虽然宏仍然可以工作,但这可能导致代码难看,程序的读者可能会想,“这些变量定义在哪里?”

2 个答案:

答案 0 :(得分:0)

  

我们不能把那些“大事”放进去   一些函数,因为调用它   功能将更耗时   比原来的if语句。

我有一个最喜欢的古英语成语:“便士明智的愚蠢”(其中我已经内疚)。另一种表达方式是“不要让小东西流汗”。 我希望我能找到关于SO的原始报价:“理发减肥”。

使代码清洁,如果您可以合理地遵循DRY,请执行此操作。 然后进行性能调整。 This is how I do it. 如果调用该函数的成本或IF语句的成本甚至上升到雷达上,我会感到非常惊讶。

答案 1 :(得分:0)

我只想到一个解决方案。主要想法是使用#ifdef

#define FUNC()  do {  \
    // big stuff ...
#ifdef FLAG_BIGGER_THAN_ONE  \
    // logic 1 ...  \
#else  \
    // logic 2 ...  \
#endif  \
} while(0)

所以我们可以写出这样的主要逻辑:

int flag;            
// ...            
if (flag > 1) {            
    while (!TimeToExitLoop()) {
#define FLAG_BIGGER_THAN_ONE            
        FUNC();
#undef FLAG_BIGGER_THAN_ONE            
    }            
}            
else {            
    while (!TimeToExitLoop()) {            
        FUNC();            
    }            
}

然而,正如迈克所说,“最好以相对的方式思考,而不是绝对。如果无法调整”大事“,这样的优化将毫无用处。