Мне нужен быстрый поиск членства для некоторого унаследованного кода обработки пакетов, который должен идентифицировать, является ли пакет с конкретным идентификатором в определенном списке.Более быстрый поиск, чем 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++» способ сделать это, сохраняя при этом максимальную производительность?
Вы попробовали 'std :: unordered_set' или просто' std :: vector '? –
5gon12eder
Прямо сейчас множество определено как std :: set. Но кажется, что unordered_set доступен только в C++ 11, который этот старый код не будет работать без большой работы. –
Danny
@ Danny: сложность поиска std :: set логарифмическая и для константы std :: unordered_set в среднем (наихудший случайный) –