Penso che tu abbia una comprensione errata dell'ottimizzazione, quindi ecco alcuni fatti al riguardo:
Innanzitutto, l'ottimizzazione è completamente irrilevante per il 99% del tuo codice! Questo è il fatto più importante sull'ottimizzazione: la maggior parte di qualsiasi codice viene eseguita in modo così raro che praticamente non esiste payoff per ottimizzarlo.
Pertanto, l'abilità più importante di cui hai bisogno per ottimizzare il tuo codice è determinare dove ottimizzare. La maggior parte delle persone usa profiler per questo.
Tuttavia, le ottimizzazioni più importanti sono generalmente a livello di algoritmo . Cioè, se la tua struttura di codice di base è pessima, puoi micro-ottimizzare tutto ciò che vuoi, non funzionerà mai bene, mentre un'implementazione del tutto schifosa usando una struttura più vantaggiosa la sovraperforma in qualsiasi momento. E dipende interamente da te come programmatore, trovare le strutture di codice migliori e usarle a tuo vantaggio. Il tuo compilatore non può farlo, perché semplicemente non può vedere l'immagine grande.
Nella mia esperienza, le cose che devi osservare a livello algoritmico sono principalmente:
-
Dove si verificano le copie?
Questo è stato un errore comune nel codice C ++ fino a quando la costruzione del movimento è arrivata. Tuttavia, è meglio non dover copiare / spostare i dati tutto il tempo. Soprattutto, è necessario evitare di incorrere in costi di copia quadratica, come di solito quando si concatenano stringhe in un ciclo.
-
Dove utilizzo costose operazioni come gli accessi al disco / le comunicazioni di rete?
È possibile eseguire molti calcoli mentre il sistema recupera un singolo blocco di dati da un disco rotante. Pertanto, quando si hanno operazioni con costi elevati, questi sono quelli che devono essere ottimizzati. Il tuo compilatore non ti aiuterà un po 'con quello. Altre operazioni da cercare: blocchi, chiamate di sistema e allocazioni di memoria.
-
Posso rappresentare i miei dati in modo tale che tutte le domande che devo porre sui dati possano essere risolte in modo banale, a basso costo?
Questa è la cosa più difficile, efficace e divertente da fare. Quando lo fai seriamente, scoprirai che puoi ottenere la complessità di molti problemi fino a una complessità lineare o addirittura costante di tempo.
Quindi, per rispondere alla tua domanda più direttamente:
Should I write my code to be clear what I am doing and rely on the
optimizer to clean up my code efficiency, or should I be obsessive
about getting every last ounce of power out of my code?
Il 99% del codice irrilevante delle prestazioni non dovrebbe assolutamente vedere micro-ottimizzazione. È del tutto controproducente.
And how much speed/size am I losing on by choosing one option over the
other?
Nessuna nel 99% del tuo codice. È l'ultimo percento che conta. La mia esperienza è che le micro-ottimizzazioni producono facilmente un aumento della velocità di 2x o più. Ma come ho detto, la potenza delle micro-ottimizzazioni è limitata: che cosa è un miglioramento 2x quando puoi migliorare la complessità del tuo algoritmo da O(N^2)
a O(1)
? (Tuttavia, ci sono casi in cui dovresti usare l'algoritmo O(N^2)
perché le dimensioni dei tuoi problemi sono troppo piccole!)
TL, DR: Non pensare nemmeno alla micro-ottimizzazione prima di aver fatto un'analisi approfondita!