Come faccio a far andare Windows veloce come Linux per la compilazione di C ++?


142

So che questa non è una questione di programmazione, ma è rilevante.

Lavoro a un progetto multipiattaforma abbastanza grande . Su Windows utilizzo VC ++ 2008. Su Linux utilizzo gcc. Ci sono circa 40k file nel progetto. Windows è 10x a 40x più lento di Linux durante la compilazione e il collegamento dello stesso progetto. Come posso ripararlo?

Una singola modifica incrementale costruisce 20 secondi su Linux e> 3 minuti su Windows. Perché? Posso anche installare il linker "gold" su Linux e ridurre il tempo a 7 secondi.

Allo stesso modo git è 10x a 40x più veloce su Linux rispetto a Windows.

Nel caso git è possibile che git non stia usando Windows in modo ottimale ma VC ++? Penseresti che Microsoft vorrebbe rendere i propri sviluppatori il più produttivi possibile e una compilazione più veloce farebbe molto per questo. Forse stanno cercando di incoraggiare gli sviluppatori in C #?

Come semplice test, trova una cartella con molte sottocartelle e fai una semplice

dir /s > c:\list.txt

Su Windows. Fallo due volte e cronometra la seconda esecuzione in modo che venga eseguita dalla cache. Copia i file su Linux ed esegui le equivalenti 2 corse e cronometra la seconda.

ls -R > /tmp/list.txt

Ho 2 workstation con le stesse specifiche esatte. HP Z600s con 12 gig di ram, 8 core a 3.0 ghz. In una cartella con ~ 400k file Windows impiega 40 secondi, Linux impiega <1 secondo.

Esiste un'impostazione di registro che posso configurare per velocizzare Windows? Cosa dà?


Alcuni collegamenti leggermente rilevanti, pertinenti ai tempi di compilazione, non necessariamente I / O.


5
Non so perché, ma questa è una differenza nota nelle caratteristiche prestazionali di Windows e Linux, Linux è MOLTO meglio di Windows nel gestire un sacco di file in una singola directory, forse è solo NTFS vs ext4 / qualunque cosa? Potrebbe anche essere che l'equivalente di Windows della cache dentaria di Linux non sia altrettanto buono.
Spudd86,

73
Perché è stato chiuso? "Non essere costruttivo" ??! Lo trovo abbastanza rilevante per gli sviluppatori.
Nils,

3
Questa domanda include fatti e può essere supportata da qualsiasi numero di fatti, riferimenti, qualsiasi cosa. Il solo fatto di pensare che un titolo sembri controverso non dovrebbe impedirci di discutere un problema di vecchia data, ma non abbastanza discusso. Essendo un utente Windows di lunga data, vorrei porre questa domanda e spero di ottenere risposte produttive in qualsiasi momento. Riaprire la domanda a meno che non sia possibile fornire prove concrete del fatto che la domanda è intrinsecamente polemica e non supportata da fatti. Altrimenti sei solo un moderatorobot.
Halil Özgür,

2
@ HalilÖzgür: OK, il tuo commento mi ha spinto a guardare la cronologia delle revisioni - il titolo della domanda originale stava ponendo qualcosa del genere. Che può benissimo essere stata la ragione (non ho votato a chiusura), perché non v'è stato un post da qualcuno chiaramente offeso dal titolo originale e ha iniziato infuria, che è stato poi cancellato, portando alla chiusura di questa domanda. Il titolo è stato modificato da allora, quindi penso che siamo a posto. Riaperto. Tieni presente che dovresti comunque cercare di non discutere la domanda ... poiché l'OP è alla ricerca di risposte, fornire risposte, nient'altro.
BoltClock

2
Sarebbe fantastico vedere qualcuno come @ raymond-chen suonare con alcune intuizioni - se la domanda rimane tecnica e offre dati / fatti abbastanza chiari per riprodurre il problema.
Benjamin Podszun,

Risposte:


32

A meno che non arrivi un hacker di sistemi Windows hardcore, non otterrai più di commenti partigiani (cosa che non farò) e speculazioni (che è quello che sto per provare).

  1. File system: dovresti provare le stesse operazioni (incluso il dir) sullo stesso filesystem. Mi sono imbattuto in questo che confronta alcuni filesystem per vari parametri.

  2. Caching. Una volta ho provato a eseguire una compilation su Linux su un disco RAM e ho scoperto che era più lento rispetto all'esecuzione su disco grazie al modo in cui il kernel si occupa della memorizzazione nella cache. Questo è un solido punto di forza per Linux e potrebbe essere il motivo per cui le prestazioni sono così diverse.

  3. Specifiche di dipendenza errate su Windows. Forse le specifiche di dipendenza del cromo per Windows non sono corrette come per Linux. Ciò potrebbe comportare compilazioni non necessarie quando si apportano piccole modifiche. Potresti essere in grado di convalidarlo utilizzando la stessa toolchain del compilatore su Windows.


Potresti approfondire un po 'il numero 2? È abbastanza sorprendente - è perché il kernel non memorizza nella cache i dati sul disco RAM o qualcosa del genere?
user541686

2
Se si alloca un pezzo di memoria come ramdisk, non è disponibile per il kernel per essere memorizzato nella cache o utilizzato per qualsiasi altra cosa. In effetti, ti stai stringendo la mano e costringendolo a usare meno memoria per i propri algoritmi. La mia conoscenza è empirica. Ho perso le prestazioni quando ho usato un RAMdisk per le compilation.
Noufal Ibrahim,

1
"A meno che [arrivi un esperto su un argomento specifico], non otterrai più di commenti partigiani ... e speculazioni": come è diverso da qualsiasi altra domanda?
Dolph,

1
Questo, grazie all'argomento Win vs. Lin, è più una calamita da fanboy. Anche la domanda è piuttosto sfumata a differenza di quelle dirette che richiedono solo comandi o metodi di utilizzo.
Noufal Ibrahim,

Il collegamento in # 1 non è più attivo.
alkasm

28

Alcune idee:

  1. Disabilita i nomi 8.3. Questo può essere un grande fattore su unità con un numero elevato di file e un numero relativamente piccolo di cartelle:fsutil behavior set disable8dot3 1
  2. Usa più cartelle. Nella mia esperienza, NTFS inizia a rallentare con più di circa 1000 file per cartella.
  3. Abilita build parallele con MSBuild; basta aggiungere l'opzione "/ m" e avvierà automaticamente una copia di MSBuild per core della CPU.
  4. Metti i tuoi file su un SSD - aiuta enormemente per l'I / O casuale.
  5. Se la dimensione media del file è molto maggiore di 4KB, prendere in considerazione la ricostruzione del filesystem con una dimensione del cluster più grande che corrisponde approssimativamente alla dimensione media del file.
  6. Assicurarsi che i file siano stati deframmentati. I file frammentati causano molte ricerche su disco, il che può costare un fattore di oltre 40 nella velocità effettiva. Utilizzare l'utilità "contig" di sysinternals o la deframmentazione di Windows integrata.
  7. Se la dimensione media del file è piccola e la partizione in cui ti trovi è relativamente piena, è possibile che tu sia in esecuzione con una MFT frammentata, il che è negativo per le prestazioni. Inoltre, i file di dimensioni inferiori a 1 KB vengono archiviati direttamente nella MFT. L'utilità "contig" di cui sopra può essere d'aiuto, oppure potrebbe essere necessario aumentare la dimensione MFT. Il seguente comando lo raddoppierà, al 25% del volume: fsutil behavior set mftzone 2Cambia l'ultimo numero in 3 o 4 per aumentare la dimensione di ulteriori incrementi del 12,5%. Dopo aver eseguito il comando, riavviare e quindi creare il filesystem.
  8. Disabilita l'ora dell'ultimo accesso: fsutil behavior set disablelastaccess 1
  9. Disabilita il servizio di indicizzazione
  10. Disabilita il tuo software antivirus e antispyware o almeno imposta le cartelle pertinenti da ignorare.
  11. Inserisci i tuoi file su un'unità fisica diversa dal sistema operativo e dal file di paging. L'uso di un'unità fisica separata consente a Windows di utilizzare gli I / O paralleli su entrambe le unità.
  12. Dai un'occhiata alle tue bandiere del compilatore. Il compilatore di Windows C ++ ha molte opzioni; assicurati di utilizzare solo quelli di cui hai veramente bisogno.
  13. Prova ad aumentare la quantità di memoria utilizzata dal sistema operativo per i buffer del pool di paging (assicurati di disporre prima di RAM sufficiente): fsutil behavior set memoryusage 2
  14. Controllare il registro degli errori di Windows per assicurarsi che non si verifichino errori occasionali del disco.
  15. Dai un'occhiata ai contatori delle prestazioni relativi al disco fisico per vedere quanto sono occupati i tuoi dischi. Lunghe lunghezze di coda o tempi lunghi per trasferimento sono segni negativi.
  16. Il primo 30% delle partizioni del disco è molto più veloce rispetto al resto del disco in termini di tempo di trasferimento non elaborato. Le partizioni più strette aiutano anche a ridurre al minimo i tempi di ricerca.
  17. Stai usando RAID? In tal caso, potrebbe essere necessario ottimizzare la scelta del tipo di RAID (RAID-5 è dannoso per operazioni pesanti come la compilazione)
  18. Disabilita tutti i servizi che non ti servono
  19. Deframmenta le cartelle: copia tutti i file su un'altra unità (solo i file), elimina i file originali, copia tutte le cartelle su un'altra unità (solo le cartelle vuote), quindi elimina le cartelle originali, deframmenta l'unità originale, copia prima la struttura delle cartelle , quindi copia i file. Quando Windows crea cartelle di grandi dimensioni un file alla volta, le cartelle finiscono per essere frammentate e lente. ("contig" dovrebbe aiutare anche qui)
  20. Se si è collegati agli I / O e si hanno dei cicli della CPU di riserva, provare ad attivare la compressione del disco. Può fornire alcune accelerazioni significative per file altamente comprimibili (come il codice sorgente), con un certo costo in CPU.

1
Anche se facessi tutte queste cose, non ti avvicineresti alla perfomance di Linux. Fai un test qui sotto e pubblica i tuoi tempi se non sei d'accordo.
b7kich,

6
Abbiamo bisogno di un benchmark migliore. Misurare il tempo necessario per enumerare una cartella non è molto utile, IMO. NTFS è ottimizzato per i tempi di ricerca di file singoli, con una struttura btree. In Linux (ultimo aspetto) un'app può leggere un'intera cartella con una singola chiamata di sistema e scorrere la struttura risultante interamente nel codice utente; Windows richiede una chiamata sys separata per ciascun file. Ad ogni modo, i compilatori non dovrebbero aver bisogno di leggere l'intera cartella ....
RickNZ,

3
Quindi quello che stai descrivendo è proprio il problema. Scegliere un benchmark diverso non risolve il problema: stai solo guardando altrove.
b7kich,

2
La domanda riguardava l'ottimizzazione dei tempi di compilazione. I tempi di enumerazione delle cartelle non dominano i tempi di compilazione su Windows, anche con decine di migliaia di file in una cartella.
RickNZ,

1
Dopo aver apportato alcune delle modifiche suggerite sopra, la seconda serie di "ls -R" per l'albero di cromo impiega 4,3 secondi per me (contro 40 secondi nell'OP). "dir / s" richiede circa un secondo. Il passaggio a un SSD non ha aiutato solo l'enumerazione, ma sospetto che aiuterà per le compilazioni.
RickNZ,

25

NTFS salva ogni volta il tempo di accesso ai file. Puoi provare a disabilitarlo: "comportamento fsutil set disablelastaccess 1" (riavvio)


6
Test che si sono ridotti di 4 secondi rispetto ai precedenti 36. Ancora abominevole rispetto a .6 secondi sulla mia VM Linux
b7kich

21

Il problema con Visual c ++ è, per quanto posso dire, che non è una priorità per il team del compilatore ottimizzare questo scenario. La loro soluzione è che usi la loro funzione di intestazione precompilata. Questo è ciò che hanno fatto progetti specifici di Windows. Non è portatile, ma funziona.

Inoltre, su Windows in genere hai scanner di virus, nonché strumenti di ripristino e ricerca del sistema che possono rovinare completamente i tuoi tempi di costruzione se controllano la tua cartella buid per te. Windows 7 resouce monitor può aiutarti a individuarlo. Ho una risposta qui con alcuni ulteriori suggerimenti per ottimizzare i tempi di costruzione di vc ++ se sei veramente interessato.


17

Personalmente ho scoperto che eseguire una macchina virtuale Windows su Linux è riuscito a rimuovere gran parte della lentezza dell'IO in Windows, probabilmente perché la VM Linux stava facendo un sacco di cache che Windows stesso non lo era.

In questo modo sono stato in grado di accelerare i tempi di compilazione di un grande progetto C ++ (250Kloc) su cui stavo lavorando da qualcosa come 15 minuti a circa 6 minuti.


sul serio? Vuoi dire che dovrei fare una prova per usare una VM come sviluppatore? Sembra strano ... quale VM usi?
Martin Booka Weser,

8
Ho testato lo scenario sopra con una VM Ubuntu 11.04 in esecuzione all'interno della mia workstation Windows 7. 0,6 secondi per la VM Linux, 36 secondi per la mia workstation Windows
b7kich

2
Se usi virtualbox e configuri un'unità condivisa, puoi essenzialmente velocizzare le tue compilazioni gratuitamente.
orlp,

La formulazione qui è molto confusa, ma suppongo che significhi una VM ospitata su Windows con Linux, non una VM con Windows ospitata su Linux ... il che è interessante, ma la mia prima lettura letterale mi ha suggerito che eseguire Windows in una macchina virtuale ospitato su Linux per compilare portato a velocità più elevate che in esecuzione di Windows in modo nativo - e che avrebbe fatto davvero stato qualcosa.
underscore_d

@underscore_d, ho visto che qualcosa , in cui una Windows in una VM funziona molto più velocemente rispetto all'hardware reale. Probabilmente perché Linux ha detto a Windows che sta funzionando su un disco reale, mentre Linux ha effettivamente fatto una cache aggressiva dietro le quinte. Anche l'installazione di Windows nella macchina virtuale è stata incredibilmente veloce, ad esempio. Questo era tornato ai giorni di XP, ma sarei sorpreso se ci fosse molta differenza oggi.
Prof. Falken,

17

La difficoltà nel farlo è dovuta al fatto che il C ++ tende a diffondersi e il processo di compilazione su molti piccoli file individuali. Questo è qualcosa in cui Linux è bravo e Windows no. Se vuoi creare un compilatore C ++ davvero veloce per Windows, prova a conservare tutto nella RAM e tocca il filesystem il meno possibile.

Questo è anche il modo in cui creerai una catena di compilazione C ++ Linux più veloce, ma è meno importante in Linux perché il file system sta già facendo molto di quel tuning per te.

Il motivo è dovuto alla cultura Unix: storicamente le prestazioni del file system sono state una priorità molto più alta nel mondo Unix che in Windows. Per non dire che non è stata una priorità in Windows, solo che in Unix è stata una priorità più alta.

  1. Accesso al codice sorgente.

    Non puoi cambiare ciò che non puoi controllare. La mancanza di accesso al codice sorgente di Windows NTFS significa che la maggior parte degli sforzi per migliorare le prestazioni sono stati apportati miglioramenti hardware. In altre parole, se le prestazioni sono lente, si aggira il problema migliorando l'hardware: il bus, il supporto di archiviazione e così via. Puoi fare così tanto se devi aggirare il problema, non risolverlo.

    L'accesso al codice sorgente Unix (anche prima dell'open source) era più diffuso. Pertanto, se si desidera migliorare le prestazioni, è necessario prima affrontarle nel software (più economico e più semplice) e poi nell'hardware.

    Di conseguenza, ci sono molte persone al mondo che hanno ottenuto il loro dottorato di ricerca studiando il file system Unix e trovando nuovi modi per migliorare le prestazioni.

  2. Unix tende a molti piccoli file; Windows tende verso pochi (o un singolo) file di grandi dimensioni.

    Le applicazioni Unix tendono a gestire molti piccoli file. Pensa a un ambiente di sviluppo software: molti piccoli file sorgente, ognuno con il proprio scopo. La fase finale (collegamento) crea un file di grandi dimensioni, ma questa è una piccola percentuale.

    Di conseguenza, Unix ha richieste di sistema altamente ottimizzate per l'apertura e la chiusura di file, la scansione di directory e così via. La storia dei documenti di ricerca Unix abbraccia decenni di ottimizzazioni del file system che riflettono molto sul miglioramento dell'accesso alle directory (ricerche e scansioni di directory complete), sull'apertura iniziale dei file e così via.

    Le applicazioni Windows tendono ad aprire un file di grandi dimensioni, tenerlo aperto per lungo tempo, chiuderlo al termine. Pensa a MS-Word. msword.exe (o qualsiasi altra cosa) apre il file una volta e lo aggiunge per ore, aggiorna i blocchi interni e così via. Il valore di ottimizzazione dell'apertura del file sarebbe una perdita di tempo.

    La storia del benchmarking e dell'ottimizzazione di Windows è stata su quanto velocemente si possono leggere o scrivere file lunghi. Questo è ciò che viene ottimizzato.

    Purtroppo lo sviluppo del software ha fatto tendenza verso la prima situazione. Diamine, il miglior sistema di elaborazione testi per Unix (TeX / LaTeX) ti incoraggia a mettere ogni capitolo in un file diverso e #includerli tutti insieme.

  3. Unix è focalizzato sulle alte prestazioni; Windows è focalizzato sull'esperienza utente

    Unix è stato avviato nella sala server: nessuna interfaccia utente. L'unica cosa che gli utenti vedono è la velocità. Pertanto, la velocità è una priorità.

    Windows è stato avviato sul desktop: agli utenti interessa solo ciò che vedono e visualizzano l'interfaccia utente. Pertanto, viene spesa più energia per migliorare l'interfaccia utente che per le prestazioni.

  4. L'ecosistema di Windows dipende dall'obsolescenza pianificata. Perché ottimizzare il software quando il nuovo hardware è a solo un anno o due di distanza?

    Non credo nelle teorie della cospirazione, ma se lo facessi, vorrei sottolineare che nella cultura di Windows ci sono meno incentivi per migliorare le prestazioni. I modelli di business di Windows dipendono dalle persone che acquistano nuove macchine come un orologio. (Ecco perché il prezzo delle azioni di migliaia di aziende è interessato se MS spedisce un sistema operativo in ritardo o se Intel non rileva una data di rilascio del chip.). Ciò significa che esiste un incentivo per risolvere i problemi di prestazioni dicendo alle persone di acquistare nuovo hardware; non migliorando il vero problema: i sistemi operativi lenti. Unix proviene dal mondo accademico, dove il budget è limitato e puoi ottenere il tuo dottorato di ricerca inventando un nuovo modo per rendere i file system più veloci; raramente qualcuno in università ottiene punti per risolvere un problema emettendo un ordine di acquisto.

    Inoltre, poiché Unix è open source (anche quando non lo era, tutti avevano accesso alla fonte) qualsiasi studente di dottorato annoiato può leggere il codice e diventare famoso rendendolo migliore. Ciò non accade in Windows (MS ha un programma che offre agli accademici l'accesso al codice sorgente di Windows, raramente viene sfruttato). Guarda questa selezione di documenti sulle prestazioni relativi a Unix: http://www.eecs.harvard.edu/margo/papers/ o consulta la storia dei documenti di Osterhaus, Henry Spencer o altri. Diamine, uno dei dibattiti più grandi (e più divertenti da guardare) nella storia di Unix è stato il ritorno tra Osterhaus e Selzer http://www.eecs.harvard.edu/margo/papers/usenix95-lfs/supplement/rebuttal. html Non vedi questo genere di cose accadere nel mondo Windows. Potresti vedere i fornitori uno alla volta, ma ultimamente sembra essere molto più raro poiché l'innovazione sembra essere a livello corporeo standard.

Ecco come lo vedo.

Aggiornamento: se guardi alle nuove catene di compilatori che escono da Microsoft, sarai molto ottimista perché gran parte di ciò che stanno facendo rende più semplice mantenere l'intera toolchain nella RAM e ripetere meno lavoro. Roba davvero impressionante.


6
Dire che il motivo è "culturale, non tecnico" non risponde davvero alla domanda. Ovviamente, ci sono uno o più motivi tecnici sottostanti per cui alcune operazioni sono più lente su Windows che su Linux. Ora, le questioni culturali possono spiegare perché le persone hanno preso decisioni tecniche da loro prese; ma questo è un sito di domande e risposte tecniche. Le risposte dovrebbero comprendere i motivi tecnici per cui un sistema è più lento dell'altro (e cosa si può fare per migliorare la situazione), non congetture non dimostrabili sulla cultura.
Brian Campbell,

Questo non sembra avere molte informazioni tecniche. Principalmente circoscritto. Penso che l'unico modo in cui otterremo informazioni tecniche reali è guardando le differenze tra i due compilatori, i sistemi di compilazione, ecc.
Ecc

Le applicazioni Windows tendono ad aprire un file di grandi dimensioni, a tenerlo aperto per lungo tempo: molte app UNIX lo fanno. Server, i miei Emacs ecc.
Noufal Ibrahim,

Non credo che emacs mantenga i file aperti per lungo tempo indipendentemente dal fatto che siano grandi o piccoli. Certamente non scrive al centro del file, aggiornandolo come farebbe un database.
TomOnTime

... e neanche i server lo fanno. Le loro funzionalità sui sistemi * nix sono generalmente divise in molti piccoli moduli con il core del server essenzialmente una shell vuota.
extra

7

Collegamento incrementale

Se la soluzione VC 2008 è impostata come più progetti con output .lib, è necessario impostare "Usa input dipendenza libreria"; questo rende il collegamento del linker direttamente contro i file .obj anziché .lib. (E in realtà lo rende in modo incrementale link.)

Prestazioni di attraversamento di directory

È un po 'ingiusto confrontare la ricerca per indicizzazione della directory sulla macchina originale con la ricerca per indicizzazione di una directory appena creata con gli stessi file su un'altra macchina. Se si desidera un test equivalente, è consigliabile creare un'altra copia della directory sul computer di origine. (Potrebbe essere ancora lento, ma ciò potrebbe essere dovuto a un numero qualsiasi di cose: frammentazione del disco, nomi di file brevi, servizi in background, ecc.) Anche se penso che i problemi perf dir /sabbiano più a che fare con la scrittura dell'output che con la misurazione del file effettivo prestazione trasversale. Anche dir /s /b > nulè lento sulla mia macchina con una directory enorme.


6

Sono abbastanza sicuro che sia legato al filesystem. Lavoro a un progetto multipiattaforma per Linux e Windows in cui tutto il codice è comune tranne per i casi in cui il codice dipendente dalla piattaforma è assolutamente necessario. Usiamo Mercurial, non git, quindi la "Linuxness" di git non si applica. L'estrazione delle modifiche dal repository centrale richiede un'eternità su Windows rispetto a Linux, ma devo dire che le nostre macchine Windows 7 funzionano molto meglio di quelle di Windows XP. Compilare il codice dopo è ancora peggio su VS 2008. Non è solo hg; CMake funziona molto più lentamente anche su Windows ed entrambi questi strumenti utilizzano il file system più di ogni altra cosa.

Il problema è talmente grave che la maggior parte dei nostri sviluppatori che lavorano in ambiente Windows non si preoccupano più di creare build incrementali, ma scoprono che invece fare una build unitaria è più veloce.

Per inciso, se si desidera ridurre drasticamente la velocità di compilazione in Windows, suggerirei la build di unità di cui sopra. È difficile implementarlo correttamente nel sistema di compilazione (l'ho fatto per il nostro team in CMake), ma una volta fatto accelera automagicamente le cose per i nostri server di integrazione continua. A seconda del numero di binari che il tuo sistema di generazione sta distribuendo, puoi ottenere da 1 a 2 ordini di miglioramento della grandezza. Il tuo chilometraggio può variare. Nel nostro caso penso che abbia accelerato la tripla build di Windows e quella di Windows di circa un fattore 10, ma abbiamo molte librerie ed eseguibili condivisi (che diminuiscono i vantaggi di una build unitaria).


5

Come costruisci il tuo grande progetto multipiattaforma? Se si utilizzano makefile comuni per Linux e Windows, è possibile degradare facilmente le prestazioni di Windows di un fattore 10 se i makefile non sono progettati per essere veloci su Windows.

Ho appena corretto alcuni makefile di un progetto multipiattaforma usando makefile comuni (GNU) per Linux e Windows. Make sta iniziando un sh.exeprocesso per ogni riga di una ricetta che causa la differenza di prestazioni tra Windows e Linux!

Secondo la GNU fare la documentazione

.ONESHELL:

dovrebbe risolvere il problema, ma questa funzione non è (attualmente) supportata per Windows. Quindi riscrivere le ricette su singole righe logiche (ad es. Aggiungendo; \ o \ alla fine delle righe dell'editor correnti) ha funzionato molto bene!


4

IMHO questo è tutto sulle prestazioni di I / O del disco. L'ordine di grandezza suggerisce che molte delle operazioni vanno su disco sotto Windows mentre sono gestite in memoria sotto Linux, ovvero Linux sta migliorando la memorizzazione nella cache. L'opzione migliore in Windows sarà quella di spostare i tuoi file su un disco veloce, un server o un filesystem. Prendi in considerazione l'acquisto di un'unità a stato solido o lo spostamento dei file su un ramdisk o un server NFS veloce.

Ho eseguito i test di attraversamento della directory e i risultati sono molto vicini ai tempi di compilazione riportati, suggerendo che ciò non ha nulla a che fare con i tempi di elaborazione della CPU o con gli algoritmi del compilatore / linker.

Tempi misurati come suggerito sopra attraversando l'albero delle directory di cromo:

  • Windows Home Premium 7 (8 GB di RAM) su NTFS: 32 secondi
  • Ubuntu 11.04 Linux (2 GB di RAM) su NTFS: 10 secondi
  • Ubuntu 11.04 Linux (2 GB di RAM) su ext4: 0,6 secondi

Per i test ho estratto le fonti di cromo (entrambe in win / linux)

git clone http://github.com/chromium/chromium.git 
cd chromium
git checkout remotes/origin/trunk 

Per misurare il tempo che ho corso

ls -lR > ../list.txt ; time ls -lR > ../list.txt # bash
dir -Recurse > ../list.txt ; (measure-command { dir -Recurse > ../list.txt }).TotalSeconds  #Powershell

Ho disattivato i timestamp di accesso, il mio scanner antivirus e aumentato le impostazioni del gestore della cache in Windows (> 2 GB di RAM), il tutto senza alcun miglioramento evidente. Il fatto è che Linux ha funzionato 50 volte meglio di Windows con un quarto della RAM.

Per chiunque voglia sostenere che i numeri sono sbagliati, per qualsiasi motivo, provalo e pubblica i tuoi risultati.


1
Dopo aver eseguito alcune delle regolazioni descritte nella mia risposta per Windows, l'esecuzione del test "ls -lR" sopra sull'albero di cromo ha richiesto 19,4 secondi. Se invece utilizzo "ls -UR" (che non ottiene le statistiche dei file), il tempo scende a 4,3 secondi. Lo spostamento dell'albero su un SSD non ha accelerato nulla, poiché i dati del file vengono memorizzati nella cache dal sistema operativo dopo la prima esecuzione.
RickNZ,

Grazie per la condivisione! Nonostante un solido miglioramento del fattore 10 rispetto allo scenario "out-of-the-box" di Windows 7, questo è ancora un fattore 10 peggiore di Linux / ext4.
b7kich,

Pensavo che il punto dell'OP fosse migliorare le prestazioni di Windows, giusto? Inoltre, come ho scritto sopra, "dir / s" viene eseguito in circa un secondo.
RickNZ,

3

Prova a usare jom invece di nmake

Scarica qui: https://github.com/qt-labs/jom

Il fatto è che nmake utilizza solo uno dei tuoi core, jom è un clone di nmake che utilizza processori multicore.

GNU lo rende pronto all'uso grazie all'opzione -j, che potrebbe essere una ragione della sua velocità rispetto a Microsoft nmake.

jom funziona eseguendo in parallelo diversi comandi make su processori / core diversi. Prova te stesso e senti la differenza!


1

Voglio aggiungere solo un'osservazione usando Gnu make e altri strumenti dagli strumenti MinGW su Windows: sembrano risolvere i nomi host anche quando gli strumenti non possono nemmeno comunicare via IP. Immagino che questo sia causato da una routine di inizializzazione del runtime di MinGW. L'esecuzione di un proxy DNS locale mi ha aiutato a migliorare la velocità di compilazione con questi strumenti.

Prima ho avuto un grosso mal di testa perché la velocità di costruzione è diminuita di un fattore di circa 10 quando ho aperto una connessione VPN in parallelo. In questo caso tutte queste ricerche DNS sono passate attraverso la VPN.

Questa osservazione potrebbe applicarsi anche ad altri strumenti di compilazione, non solo basati su MinGW e potrebbe essere cambiata nell'ultima versione di MinGW nel frattempo.


0

Recentemente ho potuto archiviare un altro modo per accelerare la compilazione di circa il 10% su Windows usando Gnu make sostituendo mingw bash.exe con la versione di win-bash

(Win-bash non è molto a suo agio per quanto riguarda l'editing interattivo.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.