实现一次性布尔切换的标准方法是什么?

时间:2009-09-21 16:24:06

标签: language-agnostic performance boolean switch-statement

假设我有类似下面的代码,processData每分钟执行数百次甚至数千次:

class DataProcessor {
private:
    DataValidator* validator;
    bool atLeastOneDataPoint;
    bool dataIsValid(Data* dataToValidate) {
        return validator->validate(dataToValidate);
    }

public:
    // ...

    void processData(Data* dataToProcess) {
        if (dataIsValid(dataToProcess) || !atLeastOneDataPoint) {
            // process data
            // ...
            atLeastOneDataPoint = true;
        }
    }

    // ...
}

从名称可以推断出,atLeastOneDataPoint是一个实际上只需要设置一次的变量,但在上面的代码中,每次在第一个数据后调用processData时都会设置它点。当然,我可以将分配线更改为:

if (!atLeastOneDataPoint) atLeastOneDataPoint = true;

但是,这只会用一堆不必要的布尔检查来代替一堆不必要的赋值。

我并不担心这段代码的性能;真的,我只是觉得做一些完全没必要的事情的想法。是否有一种标准的方式来设置这样的一次性开关,这在设计中更直观“适当”?

至于是否关心这一点让我成为一个糟糕的程序员:让我们再讨论这个讨论了。

4 个答案:

答案 0 :(得分:4)

我会说你已经得到的是最好的方法:只需在每次迭代时设置布尔标志。

如果您不关心性能,我认为这是最易读的解决方案:它很好而且显而易见 - 我处理了一个有效的数据点,所以我将标志设置为true。

即使性能受到关注,我认为您很难找到比将单个布尔值设置为true更有效的任何操作。

答案 1 :(得分:1)

回调

首先注册一个名为“call_once_at_init()”的函数,此函数将注册“call_always_after_init()”以供以后使用。

答案 2 :(得分:0)

规定您不要将atLeastOneDataPoint用作流程数据中的第一个标志

void processData(Data* dataToProcess) {
   if ( (atLeastOneDataPoint = (dataIsValid(dataToProcess) || !atLeastOneDataPoint) ) ) {
      // process data
      //...
   }
}

但每分钟10000不算什么 - 担心每秒150万次

答案 3 :(得分:0)

这不是你想要的吗?

void processData(Data* dataToProcess) {
    if (!atLeastOneDataPoint) atLeastOnedataPoint = true;
    if (dataIsValid(dataToProcess)) {
        // process data
        // ...
    }
}

这实际上只是atLeastOnedataPoint = true一次。

即使每次都这样做,执行if (!atLeastOneDataPoint) atLeastOnedataPoint = true;也应该少于100 ns(可能要少得多)。即使在100 ns时,如果你在一分钟内完成1000次,那么在那一分钟消耗100us = 0.1ms。

我打赌你有“更大的鱼来炒”。