Prima un suggerimento: probabilmente vorresti aspettare più di un paio di minuti prima di accettare una risposta: probabilmente otterrai più risposte in questo modo.
Secondo: durante il benchmarking, dovresti sempre compilare con le ottimizzazioni attivate. Qualcosa come g++ -std=c++11 -O3 -march=native
dovrebbe darti dei buoni risultati.
std::list
è davvero una struttura di dati scadente e non ho ancora trovato una situazione in cui sia la migliore. Ad esempio, si consideri il caso in cui si desidera mantenere una struttura di dati ordinati. Potresti pensare che std::list
, con O(1)
di inserimento e tempo di cancellazione sarebbe l'ideale, ma in realtà è sub-ottimale!
Per questi test, il mio tipo contenuto è una classe banale che contiene una matrice di numeri interi a 4 byte. Provo un std::array
delle dimensioni 1, 10 e 100 (dandomi una dimensione dell'elemento di 4, 40 e 400). Ho scelto un std::array
perché una mossa e una copia sono la stessa cosa. L'elemento iniziale dell'array viene inizializzato su un numero casuale compreso tra 0
e std::numeric_limits<uint32_t>::max()
. Creo un std::vector
di un certo numero di questi (l'asse x), quindi avvio il timer. Eseguo il test di iterazione su quel std::vector
per ogni elemento e inserendolo nell'ordine (come ordinato dal primo elemento nell'array, utilizzando operator<=
). Per evitare qualsiasi intelligente ottimizzazione del compilatore di rimuovere qualsiasi lavoro, ho quindi emesso il primo elemento del contenitore ordinato (che non può essere determinato fino alla fine) per alcuni file e interrompere il timer.
Questi sono i miei risultati per varie dimensioni di elementi:
Vediamocheperglielementia4e40byte,std::vector
èmiglioreancheaquestoinserimentonelmezzodistd::list
,eperqualsiasidimensionedielementostaimegliousandounstd::vector<unique_ptr>
distd::list
.
Ingenerale,nonriescoatrovareunmotivoperusarestd::list
suunaclassecheavvolgestd::vector<std::unique_ptr>
perfarlaapparirecomeseavessesemanticadelvalore,oltreallapossibilitàdicopiare(chesperodirisolvereconoinviandounaclassevalue_ptr
aBoostsenonnevieneaggiuntaunapresto,anchesec'èunadiscussioneariguardo).
Comenotaaggiuntiva,sesitrattassedicodicereale,nondiungiocodiconfronto/benchmark,avreiscrittolaversionestd::vector
inmodomoltopiùdiverso.Avreicopiatol'interocontenitoreoriginaledirettamente,quindihousatostd::sort
.Intendoscrivereun'analisipiùcompletasullestrutturedeidati,conparticolareattenzioneall'importanzadellalocalizzazionedeidati,eincluderòitempisulmodo"corretto" di farlo. (la versione corretta fa saltare tutti gli altri metodi fuori dall'acqua, completando in meno di un secondo 400.000 elementi di dimensione 400, che è 10 volte più elementi di quelli testati nei miei grafici).
Spero di aver spiegato tutto bene; questi sono alcuni test che ho eseguito diversi mesi fa e non ho ancora finito i miei appunti sull'argomento.
I test sono stati eseguiti su una macchina Intel i5 con 4 GB di RAM. Credo che stavo usando Fedora 17 x64.