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

标签 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;
    }
  }

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

  record_iterator it= sliceMap_.find(ts);                                                                                                                                                                                                                                                                                                                              
  if(it !=end()){                                                                                                                                                                                                                                                                                                                                                      
    return it;                                                                                                                                                                                                                                                                                                                                                         
  }else{                                                                                                                                                                                                                                                                                                                                                               
    return sliceMap_.upper_bound(ts);                                                                                                                                                                                                                                                                                                                                  
  }         

我觉得问题出在分支上,所以可以删除这段代码中的分支,以便分析速度上的差异吗?

最佳答案

第一种方法存在三大问题:

第二种方法也有问题。您正在搜索两次。

你为什么不直接使用

return sliceMap_.lower_bound(ts);

这应该可以通过一次对数搜索完全满足您的需求。

关于c++ - 在 C++ 中优化 if-else 分支的一个小循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13126928/

相关文章:

loops - Rust 如何知道何时停止迭代没有上限的范围?

node.js - 使用 AsyncIterator 等待 x of y 会导致内存泄漏

python - 以最小误差求解非线性方程组

c++ - 变量存储位置

c++ - Libcpmt.lib:为 'RuntimeLibrary'检测到错误LNK2038不匹配:值 'MT_StaticRelease'与值 'MD_DynamicRelease'不匹配

c++ - boost 中 compressed_matrix 分配的空间

c++ - 如何在 C++ 中获取内存位置而不等待其检索?

mysql - 使用大量连接优化慢速 MySQL 查询

java - For Each 循环有效,但迭代器无效

c++ - Qt:字段类型不完整