Hola a todos,
attualmente utilizzo in un applicativo delle double-linked list, principalmente perché mi interessava implementare il funzionamento e testarne il comportamento su campo, senza però esagerare con il carico.
Ora che ho verificato che la logica dell'applicativo e apposto ho necessità di ottimizzare il suo funzionamento. L'applicativo richiede attualmente due strutture dati:
- la prima è la configurazione, contenuta nel file sotto forma di
Viene caricata all'inizio ed è poi leggibile tramite delle macrocodice:Blocco1 { Blocco2 // commento { Chiave1 valore /** * commento **/ } Chiave2 valore # Commento } Chiave3 valore
TABLE_GET(config->table, "Blocco1.Blocco2.Chiave1")
- la seconda è un elenco di informazioni associati a chiavi contenenti due gruppi di IP/PORTA
Mentre la prima list è piccola e difficlmente può influire sulle performance dell'applicativo, la seconda può diventare veramente enorme soprattutto perché lavora tramite il modulo queue di netfilter con la conseguenza che a contenere decine di migliaia di elementi che devono essere ricercati in una frazione di secondo non ci vuole nulla.
Le hashtable sfruttano gli array, tramite un ridimensionamento dinamico che avviene quando la tabella raggiunge i limiti ed è di solito 1.5/1.7 grande rispetto alla dimensione della tabella attuale. Il cuore di un hashtable è principalmente la funzione di hashing. Di conseguenza se la funzione di hashing è scritta bene è in grado di rendere molto bene viceversa può trasformare il tutto in una killer application.
Dei Red-Black trees ... non so quasi niente a parte che sono un evoluzione dei binary trees, che come per i precedenti sconosco in gran parte, di conseguenza non posso fare paragoni tra le hashtable e gli rb-tree.
Tutto poi dipende dall'implementazione, ma effettivamente che differenza c'è a livello di performance (operazioni da effettuare) per cercare, eliminare, inserire un nodo?
E soprattutto, conoscete qualche libreria ottimizzata e performante che faccia bene il suo lavoro?