Istnieje kilka IPTables o różnych rozmiarach (np. 255 lub 16384 lub 512000 !!). Każda pozycja w każdej tabeli zawiera unikatowy adres IP (format szesnastkowy) i kilka innych wartości. Całkowita liczba adresów IP wynosi 8 milionów. Wszystkie adresy IP wszystkich IPTables są sortowaneIle wyrażeń "jeśli" wpływa na wydajność?
Musimy przeszukać IPTable 300 000 razy na sekundę. Nasz obecny algorytm znajdowania IP jest następująca:
// 10 <number of IPTables <20
//_rangeCount = number of IPTables
s_EntryItem* searchIPTable(const uint32_t & ip) {
for (int i = 0; i < _rangeCount; i++) {
if (ip > _ipTable[i].start && ip < _ipTable[i].end) {
int index = ip - _ipTable[i].start;
return (_ipTable[i].p_entry + index);
}
}
return NULL;
}
Jak można zauważyć, w najgorszym przypadku, liczba porównań na dany adres IP jest _rangeCount * 2 i liczby „czy” Sprawdzanie stwierdzenie jest _rangeCount .
Załóżmy, że chcę zmienić searchIPTable i użyć bardziej efektywnego sposobu na znalezienie adresu IP w IPTables. O ile wiem, dla posortowanej tablicy najlepsze oprogramowanie znanego algorytmu wyszukiwania, takiego jak wyszukiwanie binarne, wymaga porównania log (n) (w najgorszym przypadku).
Tak więc liczba porównań do znalezienia adresu IP to log (8000000), który jest równy ~ 23.
Pytanie 1:
Jak Można zauważyć, że jest trochę luka pomiędzy liczbą porównaniu potrzebnej przez dwa algorytmu (_rangeCount vs 23), ale w pierwszej metodzie, istnieją pewne „if”, które mogą wpływać na wydajność. jeśli chcesz uruchomić pierwszy algorytm 10 razy, oczywiście pierwszy algorytm ma lepszą wydajność, ale znam pomysł na uruchomienie dwóch algorytmów na 3000 000 razy! jaki jest Twój pomysł?
Pytanie 2:
Czy jest bardziej efektywny algorytm lub roztwór do wyszukiwania adresów IP?
Wyszukiwanie struktur danych, takich jak drzewa, wyszukiwania binarne itp. Mogą one pomóc w przyspieszeniu działania algorytmu. –
Brutalne wyszukiwanie będzie zawsze wolne. Posortuj i użyj binarnego fragmentu, lub użyj struktury drzewa, lub pół-skopiuj swoje adresy IP według pierwszego bajtu, i przeszukuj tylko w tym. Wszystko oprócz brutalnego poszukiwania siły. To twój problem, a nie drobna optymalizacja instrukcji "if". –
"log (8000000), który jest równy ~ 29000" Jak otrzymałeś ten numer? log2 (8000000) = ~ 23. – Dani