常量条件的分支预测

Branch prediction for const condition

本文关键字:分支预测 条件 常量      更新时间:2023-10-16

我有一个在编译时不知道的条件,但一旦初始化,在程序期间不会改变。我的程序看起来像这样

void cond_func(const int cond){
    switch(cond){...}
}
void loop_func(const Some_class& param){
    for(...) cond_func(param.cond);
}

分支预测是否能够判断cond始终计算为相同的值?还是最好在循环之前编写switch,然后调用适当的函数(这将导致代码的可读性降低,并带有多个代码重复)。或者我可以做一些事情来给编译器提示这个条件将保持不变,比如在循环之前提取const int cond = param.cond)的值?如果我还将循环期间的const Some_class& param传递给其他一些函数,从而理论上通过一些奇怪的指针和/或const_cast(尽管我不是)更改cond的值,会有什么变化吗?

我的循环通常有数百万甚至更长,所以我对预测分支的前几次调用并不感兴趣,但是在每个周期中在某些条件评估中花费的每一毫秒都很重要......

我认为检查一次条件并循环数百万次胜过循环数百万次并每次检查,即使有分支预测也是如此。

也许你的设计不是最好的。例如,根据开关,切换、循环和调用具有不同参数的函数。我真的不能说,我不知道你在那里做什么。