Performance 以下代码片段的Icache性能

Performance 以下代码片段的Icache性能,performance,caching,optimization,Performance,Caching,Optimization,我有一段代码 for ( ... ) { if (condition) { // some code } // some more code } 如果条件内和外部的代码大小合适,则条件内的代码大小合适。条件要么总是true,要么总是false,因此不应该有任何分支预测未命中。如果条件总是false,那么if条件中的代码是否会从指令缓存中删除?有没有什么方法可以优化icache 总的来说,我发现这样做更好: if (condition) { fo

我有一段代码

for ( ... ) 
{
    if (condition) {
       // some code
    }
    // some more code
}

如果条件内和外部的代码大小合适,则条件内的代码大小合适。条件要么总是true,要么总是false,因此不应该有任何分支预测未命中。如果条件总是
false
,那么
if
条件中的代码是否会从指令缓存中删除?有没有什么方法可以优化icache

总的来说,我发现这样做更好:

if (condition) {
     for ( ... ) 
      {
      // some code
      }
}
else
{
     for (...)
     {
     // some more code
     }
}
如果
If子句
确实是一个不变量

如果这种情况多次发生-您可以选择包含for循环的函数指针或函子,并在做出决定后调用它:

func = (condition) ? func1 : func2

然后到处调用
func

在喜剧时间总是正确还是错误?从运行时开始?依我看,这需要一个关于单一类型处理器的问题-不同的处理器会有不同的行为,因此没有通用的答案。它针对x86-64处理器。函数指针将充当afaik的不可预测分支。@usr它设置在程序开始时,一旦建立状态,从那时起,它就被调用了——根本没有分支,但CPU无法预测执行的方向。有无限多的可能目标。不过,对此并不确定。@usr基本上与roll-your虚拟函数相同。你是说没有预取,还是说这是一个分支未命中?我是说任何类型的间接调用都会暂停管道,直到计算出目标。据我所知,此暂停是间接跳转/呼叫的主要成本组成部分。正确预测的分支几乎没有延迟。