2010-10-27 7 views

risposta

6

Oltre intestazioni pre-compilazione, ci sono serie di altre cose che potrebbero essere ti rallentano:

  • Virus software di controllo - può avere un impatto sulla brutta costruisce. Se hai un correttore di virus in esecuzione prova a spegnerlo e vedi quale tipo di miglioramento ottieni.
  • RAM bassa: la RAM insufficiente causerà molte più letture del disco e rallenterà. cont ->
  • HDD lento - È necessario scrivere su disco indipendentemente e un disco lento, come quelli presenti in molti laptop e sistemi di fascia bassa, ucciderà le tue build. È possibile ottenere un'unità più veloce, un array RAID o SSD
  • Processore lento ... naturalmente.
  • Improbabile, tuttavia: controllare e verificare se i propri progetti fanno riferimento a condivisioni di rete. Il dover tirare file attraverso la rete con ogni build farebbe un grande rallentamento.

EDIT Pochi altri pensieri:

  • Se la soluzione contiene un gran numero di progetti che si potrebbe prendere in considerazione la creazione di altre soluzioni "sub" che contengono solo i progetti che si sta lavorando attivamente. Questa possibilità dipende da quanto sono correlati i tuoi progetti.
  • Le build del progetto possono avere comandi di eventi pre e post build associati ad essi. Controlla le proprietà dei tuoi progetti per vedere se ci sono eventi di costruzione costosi specificati.
+2

Se non si desidera disattivare completamente il controllo dei virus, molti scanner consentono di specificare eccezioni. Aggiungendo '* .c, * .cpp, * .h * .hpp, * .obj, * .lib, * .pch, * .ncb' all'elenco delle eccezioni ottieni il 95% della velocità, e cattura ancora tutti i comuni virus. – MSalters

+1

Le condivisioni di rete sono un enorme collo di bottiglia. Il mio tempo di compilazione è passato da ~ 1 minuto (per un banale progetto demo di 1 pagina di codice) a ~ 1 secondo quando sono passato dalla condivisione di rete al mio SSD locale. –

2

Le intestazioni precompilate possono essere utili se si includono intestazioni complesse (STL, Boost per esempio) direttamente in molti file.

Assicurarsi che la build non acceda alla rete inavvertitamente o intenzionalmente.

4

È possibile creare un file pre-compiled header che normalmente non cambierà frequentemente. Questo può aumentare notevolmente il tempo di compilazione.

+0

Non l'ho mai notato quando ho iniziato a utilizzare Visual Studio. Sono passato da Code :: Blocks che sembra farlo automaticamente per te. –

0

Se si dispone di un sacco di progetti nella soluzione rimuovere alcuni di loro. Se sono referenziati come progetti, puoi invece fare riferimento all'output binario (usa il pulsante Sfoglia nella finestra di dialogo aggiungi riferimento). Ciò rimuove un sacco di controllo delle dipendenze nella soluzione. Non è l'ideale, ma accelera le cose.

3
  • Unity builds.
  • Precompiled headers.
  • Windows 7 è molto più veloce di Windows XP (se pertinente).
  • Disattiva gli antivirus.
  • Ridurre al minimo le dipendenze (ad esempio #include dai file di intestazione).
  • Ridurre al minimo la quantità di codice modello.
3

A livello di codice, è utile ridurre al minimo la quantità di intestazioni incluse da altre intestazioni. Il caricamento e la lettura ripetuti di file possono avere un grande impatto. Invece, avanti dichiarare le cose ovunque possibile. Per esempio:

#include <iosfwd> 
#include <string> 
#include "M.h" 
#include "R2.h" 
#include "A2.h" 

class M2; 
class A; 
class R; 
template<class C> class T; 

class X{ 
    M member; // definition of M is required 
    M2 *member2; // forward declaration is sufficient for pointers & references 
public: 
    // forward declaration of argument type A is sufficient 
    X(const A &arg); 

    // definition required for most std templates and specializations 
    X(const std::string &arg); 

    // forward declaration of your own templates is usually okay... 
    void f(T<int> t); 

    // unless you're defining a new one. The complete definition 
    // must be present in the header 
    template<class Z> 
    void whatever(){ 
    // blah blah 
    } 

    R f(); // forward declaration of return type R is sufficient 

    // definitions of instantiated types R2 and A2 are required 
    R2 g(A2 arg){ 
    return arg.h(); 
    } 

    // ostream is forward-declared in iosfwd 
    friend std::ostream &operator << (std::ostream &o, const X &x); 
}; 

Gli utenti di questa classe dovranno #include qualunque file forniscono le definizioni di classe se effettivamente chiamare uno dei X(const A&), f(t<int>), f() o operator <<.

I modelli quasi certamente si aggiungeranno al sovraccarico di inclusione. Questo è generalmente il loro valore, secondo me. Quando crei i tuoi modelli, la definizione completa deve risiedere nel file di intestazione; non può andare in un file cpp per una compilazione separata. I modelli standard non possono essere inoltrati dichiarati, poiché le implementazioni sono autorizzate a fornire parametri di modello aggiuntivi (con argomenti predefiniti) e le dichiarazioni di inoltro dei modelli devono elencare tutti i parametri del modello. L'intestazione iosfwd forward-dichiara, tra le altre cose, tutti i modelli e le classi standard del flusso. I tuoi modelli possono essere inoltrati, purché non crei istanze di specializzazioni.

Le intestazioni precompilate possono anche aiutare, ma la maggior parte dei compilatori limita la quantità che è possibile includere in un file di origine (Visual Studio vi limita a uno), quindi non sono una panacea.

0

La soluzione che abbiamo utilizzato era IncrediBuild. Basta lanciare più hardware sul problema. Oltre a tutte le macchine sviluppatrici (abbastanza potenti esse stesse) avevamo un numero di server 4-core che non facevano altro che compilare.

0

Cambiare la piattaforma della soluzione sull'opzione "Qualsiasi CPU" che viene fornita nella parte superiore di visual stdio, quindi la velocità di costruzione del programma sarà sicuramente aumentata.