相关疑难解决方法(0)

std :: bitset如何比std :: vector <bool>更快?

根据这个答案,海报期望std::bitset大小100k位比std::vector<bool>查询单个位时更快.这怎么可能?

如果std::bitset显然允许任意大小,他们甚至可能在实施方面有显着差异std::vector

c++

34
推荐指数
2
解决办法
3万
查看次数

比std :: set更快的查找

我需要对一些遗留数据包处理代码进行更快的成员资格查找,这需要识别具有特定ID的数据包是否在特定列表中.

该列表仅每隔几秒更新一次,而数据包匹配经常发生,因此查找性能比插入/删除等更重要.

一般流程:

forall(special_PacketIDs)
{
  pktIdSet.insert(theSpecialPktId)
}

while (1)
{
  pkt = readPkt();
  pktID = getPktIdOfPkt(pkt);

  if ( aSpecialPkt(pktID) )
    doSomething();
}
Run Code Online (Sandbox Code Playgroud)

现在,aSpecialPkt(pktId)定义为:

bool PktProcessor::aSpecialPkt(unsigned short pid)
{
  return pktPidSet.find(pid) != pktPidSet.end();
}
Run Code Online (Sandbox Code Playgroud)

gprof报告了在std :: set :: find()中花费的大量时间

pktId的范围仅为8192个可能的值.以内存为代价分配线性阵列会更快,例如:

class LinearSet
{
public:
  void insert(pid) { mPktIdSet[pid] = true; }
  bool elementExists(pid)  { return mPktIdSet[pid]; }
private:
  bool mPktIdSet[8192];
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,在保持最佳性能的同时,是否有更多的"C++"方法可以做到这一点?

c++ stdset

2
推荐指数
1
解决办法
200
查看次数

标签 统计

c++ ×2

stdset ×1