La performance "ideale" di un algoritmo nella mente delle persone dipende da quale sia l'opzione migliore là fuori. Se è possibile eseguire un'operazione di "ricerca" su una struttura di dati in tempo O (n log N), è abbastanza veloce? Forse lo è. Tuttavia, per molte strutture puoi fare una ricerca in O (n), o anche O (log n), così la gente chiamerà il tuo O (n log n) "lento". Questo non perché è in realtà lento, ma perché ci sono algoritmi più veloci che soddisfano le loro esigenze.
In generale, le persone hanno trovato algoritmi che girano più velocemente di O (log n) che soddisfano le loro aspettative sulla gestione della memoria. Pertanto, qualsiasi algoritmo O (log n) verrà contrassegnato come "troppo lento" dal popoloso generale, a meno che non offra alcune funzionalità valide per compensare questo cambio di velocità. Non venderai molte auto sportive con motori 50HP in un paese in cui gli sportcar hanno tutti 250 + HP, a meno che tu non possa mostrare un valore unico di questa vettura sportiva 50HP. Forse è più economico o biodegradabile.
La maggior parte degli sviluppatori che usano questi algoritmi di gestione della memoria non vogliono pensare al costo dell'API sottostante. Se devono anche considerare le prestazioni di runtime asintotiche della loro gestione della memoria, allora è troppo lento per loro. Lo rifiuteranno.
Tutto ciò significa che le vere librerie di gestione della memoria tendono a modellare le prestazioni in modo più sfumato rispetto alla semplice notazione Big-Oh. Big-Oh è bello, ma per il tipo di performance a cui sono interessati, non è abbastanza buono. I gestori della memoria devono preoccuparsi delle costanti di tempo effettive che governano la velocità di esecuzione, che Big-Oh semplicemente ignora. Le loro analisi runtime includono cose come errate previsioni delle branche e jitter e letture / scritture non casuali per ottenere un po 'di prestazioni in più.
Quindi alla fine, se viene data la possibilità di scegliere tra un algoritmo O (log n) e un algortihm sintonizzato con bordo sanguinante che richiede 3 cicli per allocare oggetti più piccoli di 64 byte e 20-40 cicli per oggetti più grandi, quale hai intenzione di scegliere?