我在C ++中创建一个应用程序,它需要一个在启动时读取和解释的配置文件。它将包含诸如以下内容:
Module1=true
现在,我最初的计划是将所有内容存储在变量中,只需要
If(module1) {
DO_STUFF();
}
然而,这似乎是浪费,因为它会不断检查一个永远不会改变的值。有什么想法吗?
答案 0 :(得分:1)
只有在发现有分析器的瓶颈时才优化代码。 分支预测 是一个明显的性能损失。
如果你想进行实验,你可以分支一次,并使指针指向正确的函数:
module1
但这只是个人资料,看看大会......
您可以使用更慢,但更舒适的方式存储配置,例如:在具有枚举索引或地图的数组中。如果我在循环中得到一些价值,我会这样做:
using func_ptr = void (*)();
func_ptr p = [](){};
if(module1)
p = DO_STUFF;
while(...)
p();
所以我最终会得到你已经拥有的东西。
答案 1 :(得分:1)
根据程序的设置方式以及变量如何改变代码行为,您可以使用函数指针:
if(Module1 == true)
{
std::function<void(int)> DoStuff = Module1Stuff;
}
然后是:
while(true)
{
DoStuff(ImportantVariable);
}
有关详细信息,请参阅http://en.cppreference.com/w/cpp/utility/functional/function。
不是说我觉得它会帮助那么多,但它至少可以尝试。
答案 2 :(得分:1)
如果您知道所检查值的所有用例,则可以解决此问题。例如,如果您已阅读配置文件且module1
为true
- 您执行了一项操作,如果它是false
- 另一项。让我们从示例开始:
class ConfigFileWorker {
public:
virtual void run() = 0;
};
class WithModule1Worker {
public:
void run() final override {
// do stuff as if your `Module1` is true
}
};
class WithoutModule1Worker {
public:
void run() final override {
// do stuff as if your `Module1` is false
}
};
int main() {
std::unique_ptr<ConfigFileWorker> worker;
const bool Module1 = read_config_file(file, "Module1");
if (Module1) { // you check this only once during launch and just use `worker` all the time after
worker.reset(new WithModule1Worker);
} else {
worker.reset(new WithoutModule1Worker);
}
// here and after just use the pointer with `run()` - then you will not need to check the variable all the time, you'll just perform action.
}
因此,您有2个案例(true
和false
)的预定义行为,并且在启动时解析配置文件时只创建其中一个对象。这是java-like
代码,但当然你可以使用函数指针,std::function
和其他抽象而不是基类,但是,基类选项在我看来更灵活。
答案 3 :(得分:0)
性能明智的布尔检查没有问题,除了你开始做数百万或数十亿次。也许你可以开始合并属于module1的代码,但除此之外,你必须像现在一样检查它
答案 4 :(得分:0)
这真的不是问题。如果您的程序要求Module1
应该为true,那么让它检查值并继续。除非经过多次检查,否则它不会影响您的表现。
如果被检查的次数太多,你可以做的就是制作一个内联函数。但是,你必须确保该功能不应该太大,否则它将成为一个更大的瓶颈
答案 5 :(得分:0)
对不起伙计们,我查看时没有发现这个: MDSN 所以我在启动时检查一次布尔值,然后我就不再需要了,因为只启动了正确的函数。