Stiamo lavorando su una base di codice C ++ di dimensioni moderate (10Mloc) che attraverso i nostri sforzi di ottimizzazione sta diventando uniformemente lenta .
Questa base di codice è un insieme di librerie che combiniamo per metterle al lavoro. Quando è stato sviluppato il quadro generale di come comunicano queste biblioteche, c'è stata una certa enfasi sulle prestazioni e in seguito, quando sono state aggiunte più parti, il quadro generale non è stato cambiato molto. L'ottimizzazione è stata effettuata quando necessario e con l'evolversi del nostro hardware. Ciò rese evidente la costosa decisione iniziale solo molto più tardi. Siamo ora a un punto in cui ulteriori ottimizzazioni sono molto più costose poiché richiederebbero riscrivere gran parte della base di codice. Ci troviamo ad avvicinarci a un minimo locale indesiderabile poiché sappiamo che in linea di principio il codice dovrebbe essere in grado di funzionare molto più velocemente.
Esistono metodologie di successo che aiutano a decidere quali sono le conseguenze per l'evoluzione di una base di codice verso una soluzione globalmente ottimale che non sia facilmente confusa da facili opportunità di ottimizzazione?
MODIFICARE
Per rispondere alla domanda su come stiamo attualmente profilando:
Abbiamo davvero solo 2 diversi scenari su come utilizzare questo codice, entrambi imbarazzanti parallelamente. La profilatura viene eseguita sia con il tempo dell'orologio a parete mediato su un ampio campione di input sia su esecuzioni più dettagliate (costi di istruzione, previsioni errate delle filiali e problemi di memorizzazione nella cache). Funziona bene poiché giriamo esclusivamente su macchine estremamente omogenee (un gruppo di un paio di migliaia di macchine identiche). Dal momento che di solito teniamo occupate tutte le nostre macchine per la maggior parte del tempo a correre più velocemente significa che possiamo esaminare ulteriori novità. Il problema è ovviamente che quando si presentano nuove variazioni di input, potrebbero ricevere una penalità in ritardo poiché abbiamo rimosso le micro-inefficienze più ovvie per gli altri casi d'uso, riducendo in tal modo il numero di scenari "in esecuzione ottimale".
sloc
. L'ho chiamato "moderatamente dimensionato" perché non ho idea di cosa sia considerato "grande" qui.