Per me, quando si tratta delle prestazioni delle strutture dati standard e degli algoritmi e degli allocatori di memoria (e l'unico motivo per utilizzare l'uno o l'altro in genere è per le prestazioni), sono piuttosto facili da battere se la soluzione è meno generalizzata rispetto alla libreria standard, ed è quasi impossibile da battere quando si tenta di soddisfare esattamente gli stessi requisiti.
Ad esempio, è molto difficile battere std::sort
in C ++ se si desidera un ordinamento di confronto generalizzato (almeno a meno che non si utilizzi una versione parallelizzata). Tuttavia, puoi facilmente battere std::sort
se usi anche un ordinamento naïve di tipo radix che funziona solo su numeri interi o puntatori.
Allo stesso modo, in genere si è in difficoltà a superare l'efficienza del malloc
di C se si desidera un allocatore thread-safe generico in grado di gestire allocazioni di dimensioni variabili e blocchi di memoria singoli. Ma puoi facilmente batterlo se usi una lista libera che può solo raggruppare blocchi di una dimensione specifica ed è progettata per essere usata da un thread alla volta, o un allocatore sequenziale che si raggruppa in modo sequenziale e non t offrire la possibilità di liberare i pezzi singolarmente.
Sarà estremamente difficile, se non impossibile, battere std::vector
in C ++ in tutti i casi pur soddisfacendo requisiti identici. Ma è abbastanza facile batterlo per una sequenza che è specificatamente ottimizzata per memorizzare solo, per esempio, da 0 a 8 elementi.
Allo stesso modo è improbabile che il HandRolledArrayList<Float>
superi la ArrayList<Float>
in Java. Ma puoi facilmente sovraperformare se usi semplicemente una matrice di float
invece.
E se lavori in un'area veramente critica in termini di prestazioni in cui esegui il ciclo di milioni di cose e / o hotspot scoperti attraverso la misurazione, a volte può pagare per implementare una struttura di dati o un allocatore o un algoritmo in concorrenza con fornito nella libreria standard, ma in genere solo se l'implementazione è di gran lunga meno generale dei requisiti che gli implementatori di libreria standard dovevano soddisfare.