用堆重新排序性能

时间:2014-08-12 09:14:57

标签: c++ boost heap

我收到的数据包需要根据时间戳(64位)重新排序 我使用了boost :: priority_queue。
所以每次我收到一个数据包,我都会把它插入队列中 我收到的每100个数据包我弹出timedout数据包
通常堆的大小在8000-15000个元素之间 从google perf顶部来看,pop似乎比插入更多的cpu

 55.80%  [.] CrReorderMbuf::GetTimedOut(unsigned long, unsigned int&)
 14.59%  [.] CrReorderMbuf::Insert(rte_mbuf*, unsigned long&, unsigned int&)
  1. 是否有更好的数据结构或堆不是来自提升
    我试图使用d_ary我没有看到性能上的变化
  2. 我没有从boost priority_queue / d_ary_heap中找到弹出一堆元素的方法。
    如果我可以按顺序遍历元素,然后在一个命令中将它们从堆中删除,它可以提高性能。(我不知道它可能会在每个pop上堆积起来)
  3. 这是我在堆中保存的元素:

    struct SrMbufElement
    {
        RU64 nTimeStamp;//timestamp of packet + timeout
        rte_mbuf * pMbuf;//pointer to mbuf
        RU32 nMbufIndex;
    };
    

    这是我的GetTimeout功能

    rte_mbuf * CrReorderMbuf::GetTimedOut(RU64 pi_nCurrentTime,RU32 & po_nMbufIndex)
    {
        if(!m_heapMBuff.empty()) 
        {
            const SrMbufElement &mbufElmnt = m_heapMBuff.top();
            if(mbufElmnt.nTimeStamp <= pi_nCurrentTime)
            {
                rte_mbuf *  pmBuf = mbufElmnt.pMbuf;
                po_nMbufIndex = mbufElmnt.nMbufIndex;
                m_heapMBuff.pop();
                return pmBuf;
            }
        }
        return NULL;
    }
    

0 个答案:

没有答案