在c ++中优化if-else分支的小循环

leo*_*on 0 c++ optimization iterator

是否可以删除以下循环中的分支.所有迭代器都来自容器类型std::map<type_name, T>

  record_iterator beginIter = lastLookup_;                                                                                                                                                                                                                                                                                                                             
  record_iterator endIter = lastLookup_;                                                                                                                                                                                                                                                                                                                               
  ++endIter;                                                                                                                                                                                                                                                                                                                                                           
  for(;endIter != end(); ++beginIter, ++endIter){                                                                                                                                                                                                                                                                                                                      
    time_type now = beginIter->first;                                                                                                                                                                                                                                                                                                                                  
    if(ts == now){                                                                                                                                                                                                                                                                                                                                                     
      lastLookup_ = beginIter;                                                                                                                                                                                                                                                                                                                                         
      return beginIter;                                                                                                                                                                                                                                                                                                                                                
    }else if(ts > now && ts <= endIter->first){                                                                                                                                                                                                                                                                                                                        
      lastLookup_ = beginIter;                                                                                                                                                                                                                                                                                                                                         
      return endIter;
    }
  }
Run Code Online (Sandbox Code Playgroud)

该算法试图解决的问题是优化正向查找,假定该位置与最后一个查找位置相同或(不太远)前进.理想情况下,我保留了最后查找位置的迭代器,并线性向前移动.但这似乎具有相同的表现,

  record_iterator it= sliceMap_.find(ts);                                                                                                                                                                                                                                                                                                                              
  if(it !=end()){                                                                                                                                                                                                                                                                                                                                                      
    return it;                                                                                                                                                                                                                                                                                                                                                         
  }else{                                                                                                                                                                                                                                                                                                                                                               
    return sliceMap_.upper_bound(ts);                                                                                                                                                                                                                                                                                                                                  
  }         
Run Code Online (Sandbox Code Playgroud)

我觉得问题是分支,所以可以删除此代码中的分支,以便我可以分析不同的速度?

Dav*_*men 5

第一种方法有三个大问题:

第二种方法也存在问题.你正在搜索两次.

你为什么不用它

return sliceMap_.lower_bound(ts);
Run Code Online (Sandbox Code Playgroud)

这应该通过一次对数搜索完全符合您的要求.