Puoi eseguire il software con un debugger o IDE?
Il debugger ha un pulsante "pausa" o puoi interrompere il programma digitando Ctrl-C o un tasto del genere?
Se il programma sta diventando più lento e lento, sta facendo almeno una cosa che non ha bisogno di fare e di fare sempre di più.
Dal momento che potrebbe essere in esecuzione, diciamo, 1/3 del tempo in cui è attualmente in esecuzione, significa che 2/3 del tempo sta facendo cose che non ha bisogno di fare.
Se riesci a scattare un'istantanea a raggi X in un momento casuale, è probabile che 2/3 vedrai che esegue le cose non necessarie.
Mettilo in pausa mentre è in esecuzione ed esamina cosa sta facendo e perché.
Esamina in particolare ogni riga di codice sullo stack delle chiamate.
Vedi se riesci a spiegare a te stesso o a qualcun altro esattamente perché, in dettaglio, è stato speso quel particolare istante di tempo.
(Non è necessario misurare nulla. È necessario vedere se si può sbarazzarsi di ciò che sta facendo).
Ripeti l'operazione alcune volte, ad esempio 5 o 10 volte.
Se ciò che il programma sta facendo in quel momento non è realmente necessario, e lo sta facendo in più di una volta lo hai fermato, hai trovato qualcosa che puoi aggiustare che ti darà una grande accelerazione, garantita.
Più grande è il problema, più velocemente lo troverai.
Non ha niente a che fare con i requisiti.
Non ha niente a che fare con le misurazioni.
Ha tutto a che fare con solo "casa delle pulizie", con questo metodo.
Ecco un esempio abbastanza tipico.
Modifica
È la saggezza convenzionale ascoltare "misura misura" o "usare un profiler".
Ciò che è non convenzionale è sentire quanta velocità è stata raggiunta in quel modo.
Le poche volte in cui ho ascoltato i risultati del profiling, era pari al 10% - 40%, o un fattore compreso tra 1,1 e 1,4.
È piuttosto anemico.
Se viene trovata e risolta una serie di problemi, c'è un effetto composto, come mostrato nell'esempio sopra.
P.S. Ecco un esempio in C ++ di un aumento di 3 ordini di grandezza, contenente tutte le versioni del codice sorgente, copie di campioni e descrizione dettagliata di come è fatta. Alcuni programmatori hanno imparato / scoperto come farlo, ma la maggior parte non l'ha fatto. Non potrebbe essere più semplice.
Fino ad oggi, sono ancora totalmente disorientato dal fatto che non sia una conoscenza comune.
L'unica spiegazione che posso vedere è che gli insegnanti non funzionano con programmi abbastanza grandi da richiedere questo tipo di ottimizzazione.
Quello che fanno è insegnare gprof , per nessun altro motivo se non quello che è lì, in modo che possano insegnarlo e andare avanti.
Ciò che fa è infettare i loro studenti con tutti i miti della sintonizzazione delle prestazioni , che ha generato esattamente i problemi che descrivi.
P.P.S. Nel caso in cui il punto non sia chiaro, qualsiasi thread, sia esso da solo o tra migliaia, ha una certa quantità minima di lavoro che deve assolutamente fare per raggiungere il suo scopo. Qualunque cosa stia facendo al di là di ciò sta richiedendo più tempo.
Nell'esempio collegato a sopra (che è solo un esempio particolare - ogni app è diversa) questi "colli di bottiglia" sono stati rimossi:
- 33,3% in
push_back
- 11,1% nell'indicizzazione fuori linea
- 7.4% in Aggiungi / Rimuovi
- 31,9% in
new
e delete
- 9,3% nell'ottenere l'ennesimo elemento della lista
- 6,1% nell'I / O dei caratteri
Aggiunta fino a oltre 99% !
Rimuovendoli ottieni ordini di accelerazione della magnitudine.
Ora il tipo di cosa che sento è "Beh certo, è sciocco da fare 2, e 6 non era nemmeno necessario".
Ehi, nolo contendere , ma che dire degli altri quattro "colli di bottiglia"?
Se non li aggiusti, quanto ottieni?
Se vuoi un serio aumento di velocità, indipendentemente dal fatto che venga utilizzato o meno un profiler, devi pulire tutti i problemi !
Tutti quelli che mancheranno saranno i limitatori di velocità dominanti.