2016-02-26 2 views
2

Мне нужен быстрый поиск членства для некоторого унаследованного кода обработки пакетов, который должен идентифицировать, является ли пакет с конкретным идентификатором в определенном списке.Более быстрый поиск, чем std :: set

Список обновляется только через каждые несколько секунд, в то время как соответствующий пакет происходит очень и очень часто, поэтому поиск производительность является более важным, чем вставка/удаление и т.д.

Общий поток:

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

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

    if (aSpecialPkt(pktID)) 
    doSomething(); 
} 

И прямо сейчас , aSpecialPkt(pktId) определяется как:

bool PktProcessor::aSpecialPkt(unsigned short pid) 
{ 
    return pktPidSet.find(pid) != pktPidSet.end(); 
} 

дргоЕ сообщает много времени, потраченного в станд :: набор :: Find()

Диапазон pktId - всего 8192 возможных значения. Выделяют линейный массив будет гораздо быстрее за счет памяти, что-то вроде:

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

Мой вопрос заключается в том, есть ли более «C++» способ сделать это, сохраняя при этом максимальную производительность?

+1

Вы попробовали 'std :: unordered_set' или просто' std :: vector '? – 5gon12eder

+0

Прямо сейчас множество определено как std :: set . Но кажется, что unordered_set доступен только в C++ 11, который этот старый код не будет работать без большой работы. – Danny

+0

@ Danny: сложность поиска std :: set логарифмическая и для константы std :: unordered_set в среднем (наихудший случайный) –

ответ

8

Если вы знаете, что существует только 8192 возможностей, лучшим вариантом является, вероятно, std::bitset<8192>, который будет использовать килобайт и очень удобен для кеширования.

+1

Отличный выбор. Просто добавив для будущей ссылки, что если размер намного больше, а некоторые фальши в порядке, то возможно [фильтр цветения] (https://github.com/mavam/libbf). –

+0

Это прекрасно. Благодаря! – Danny

+1

@AmiTavory Очень приятное предложение - хороший прецедент для неуловимого цветения фильтра. :) – erip

 Смежные вопросы

  • Нет связанных вопросов^_^