例子:
if (almost_always_false_condition) {
// do something
}
有没有一种方法可以建议编译器,在99%的条件下将为false。 条件计算需要大约60个周期进行检查,并且编译器本身无法在编译时计算它。
(gcc 4.3)
例子:
if (almost_always_false_condition) {
// do something
}
有没有一种方法可以建议编译器,在99%的条件下将为false。 条件计算需要大约60个周期进行检查,并且编译器本身无法在编译时计算它。
(gcc 4.3)
__builtin_expect( )
:if (__builtin_expect(almost_always_false_condition,0)) {
// do something
}
然而,听起来你想找到一种避免评估条件的方法,但是__builtin_expect()
不会做到这一点。你是否有一种快速近似条件的方法,并且只在近似条件为真时进行完整检查:
if (__builtin_expect(fastCheckThatIsTrueIfFullConditionIsTrue,0)) {
// most of the time, we don't even get to here, so you don't need
// to evaluate the condition
if (almostAlwaysFalseCondition) {
// do something
}
}
你能告诉我们更多关于这种情况的信息吗?
if (a == 5 && somethingexpensive())
{
...
}
由于计算a == 5
比somethingexpensive()
更便宜,如果它几乎总是false
,则应该首先运行它,这可以避免评估somethingexpensive
子句。
另一方面,如果结果在程序运行期间保持不变,则可以通过将计算结果存储在静态或全局变量中来进行优化。
static int result = doevalfunctiononlyonce();
if (result)
{
....
}
if
的成本降低到了一个简单的内存查找。int condition;
void appendToList(int a)
{
list.append(a);
if (list.somethingexpensive())
{
condition = true;
} else
{
condition = false;
}
}
void someotherfunction()
{
// if (list.somethingexpensive())
if (condition)
{
...
}
}
如果someotherfunction
被调用的次数比appendtolist
函数多得多,那么这将非常有用。
else
子句或程序的其他位置花费了多少个循环周期?如果你进行分析或获取stackshots,那么你是否在该测试中花费了至少10%的时间?如果没有,那么可能存在更大的问题,你应该首先关注这些问题。a
和b
,则信息量(熵)以位为单位为-(a*log(a) + b*log(b))/log(2)
。-fprofile-generate
和-fprofile-use
选项。这需要一组代表性用例来收集有关可能和不可能的信息,但测试可以用于此目的。另一方面,代码没有装饰着丑陋、不可移植的指令。