Domanda

Abbiamo esaminato le versioni g ++ 3.2.3 e 4.2.4. Con 4.2.4, i miglioramenti delle prestazioni su alcuni dei nostri codici sono significativi.

Ho provato a cercare nel database gcc buzilla per trovare suggerimenti su quali bug potrebbero avere ha avuto un miglioramento così drammatico, ma non ho trovato alcun bug individuale che si è distinto come candidato.

I miglioramenti sono il risultato di molte piccole modifiche che hanno avuto lentamente un effetto? Oppure si dice che una delle prime 5 serie di miglioramenti potrebbe aver fatto la differenza?

Per alcuni retroscena, la nostra base di codice fa buon uso dei contenitori e degli algoritmi STL, nonché delle funzionalità C ++ come la parola chiave "inline".

È stato utile?

Soluzione

Nella mia esperienza, 3.4 è dove le prestazioni hanno sostanzialmente raggiunto il picco; 4.2 è in realtà più lento di 3.4 nel mio progetto, con 4.3 che è il primo a circa eguagliare le prestazioni di 3.4. 4.4 è leggermente più veloce di 3.4.

Ci sono alcuni casi specifici che ho scoperto in cui le versioni precedenti di gcc eseguivano alcune cose incredibilmente ritardate nel codice - c'era una funzione particolare che andava da 128 a 21 orologi da 3.4 a 4.3, ma ovviamente era una speciale caso (era un breve ciclo in cui l'aggiunta di poche istruzioni non necessarie ha danneggiato gravemente le prestazioni).

Uso personalmente 3.4 solo perché si compila molto più velocemente, rendendo i test molto più veloci. Cerco anche di evitare le ultime versioni perché sembrano avere cattive abitudini di codice errato; --march core2 sulle recenti versioni di gcc provoca segfaults nel mio programma, ad esempio perché emette codice auto-classificato che tenta di eseguire accessi allineati su indirizzi non allineati.

Complessivamente sebbene le differenze siano raramente grandi; Il 3-5% è il più assoluto che ho visto in termini di cambiamento delle prestazioni.

Ora, nota che questo è C; le cose potrebbero essere diverse in C ++.

Altri suggerimenti

Credo che l'ottimizzatore sia stato completamente rielaborato nella serie gcc4. Vedi questa pagina, ad esempio, sulla vettorializzazione:

http://gcc.gnu.org/projects/tree-ssa /vectorization.html

Per informazioni, una volta ho fatto un benchmark di c [i] = a [i] + b [i] con array dinamici, array statici e std :: vector ed è stato lo std :: vector che è stato il più veloce ( w / gcc 4.1). 30% di differenza prestazionale.

Gli stream erano molto lenti in 3.3 e sono diventati molto più veloci in 3.4. ( messaggio sulla mailing list gcc ) Scommetto che anche altre cose sono migliorate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top