Ottengo risultati di profilazione validi con l'ottimizzazione disattivata?

7

Uso perf per profilare la mia applicazione. Per semplificare l'interpretazione del grafo delle chiamate risultante, ho partizionato i loop principali utilizzando le funzioni dell'etichetta come maptable_appendRange che possono essere facilmente ricercate nel grafico delle chiamate. Sfortunatamente, queste funzioni sono per lo più evidenziate dall'ottimizzatore e quindi non appaiono nel grafico delle chiamate.

Per risolvere il problema, posso compilare senza ottimizzazione ( -O0 ) e tutto va bene e la profilazione con le mie funzioni per le etichette è una beatitudine. D'altra parte, l'ottimizzazione ha un impatto abbastanza significativo sulle prestazioni generali del mio codice e non sono sicuro che la profilazione senza ottimizzazione sarà rappresentativa delle prestazioni effettive.

Quindi ecco la mia domanda: posso aspettarmi risultati rappresentativi quando si profila un codice non ottimizzato?

    
posta Johannes Luong 23.08.2016 - 13:03
fonte

2 risposte

7

Devi chiedere a perché stai creando un profilo.

  1. Per ottenere misurazioni generali delle prestazioni.

  2. Per trovare i modi per rendere il codice ancora più veloce.

Se la risposta è 1, quindi con tutti i mezzi, esegui il tuo profiler sul codice ottimizzato.

Se la risposta è 2, non farlo. Ecco perché. Ci sono due tipi di accelerazioni, quelle che puoi fare e quelle che il compilatore può fare.

Il compilatore non riesce a trovare o correggere gli aumenti di velocità che è possibile fare, come minimizzare l'allocazione della memoria, le funzioni di memoizzazione che vengono richiamate con argomenti ripetuti, evitando chiamate di librerie dall'aspetto innocente che finiscono con l'I / O breezy, on e on.

Non c'è nessun bug di velocità che puoi correggere reso più evidente dall'ottimizzatore.

Ciò che può fare è renderli più difficili da trovare rimescolando il codice, inserendo in modo casuale, eliminando i frame dello stack e così via.
E tieni presente che l'unico miglioramento che può effettivamente apportare è nella parte inferiore dello stack di chiamate e solo se è in il tuo codice. Qualunque cosa faccia più in alto nello stack è di beneficio minimo / trascurabile.

La strategia che alcune persone usano è questo , e il motivo statistico per cui funziona è qui . Dopo averlo fatto abbastanza per rendere il codice incredibilmente veloce senza l'ottimizzatore , quindi attiva l'ottimizzatore per renderlo ancora più veloce.

    
risposta data 23.08.2016 - 15:16
fonte
8

Se desideri che i risultati del profiling siano significativi, devi utilizzare i flag di ottimizzazione che intendi utilizzare nella produzione.

Detto questo, puoi dire alla maggior parte dei compilatori di non incorporare mai funzioni specifiche. Ad esempio, se si utilizza gcc, è possibile contrassegnare le funzioni dell'etichetta con __attribute__((noinline)) :

__attribute__((noinline)) int func()
{
    ...
}

(Altri compilatori di solito forniscono estensioni simili). Ciò dovrebbe consentire alle funzioni di etichetta di apparire nel profilo anche quando le ottimizzazioni sono abilitate. Tieni presente che l'attributo è specifico per gcc, quindi rimuovilo una volta terminato il profiling o includilo in una macro che non restituisce nulla se viene utilizzato un compilatore diverso.

Ovviamente, se l'inlining di queste funzioni specifiche ha effettivamente un impatto significativo sulle prestazioni, i risultati del profilo potrebbero non essere ancora pienamente rappresentativi.

    
risposta data 23.08.2016 - 14:06
fonte

Leggi altre domande sui tag