|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: May 2009
Messaggi: 9
|
[C] AIUTO, forte calo prestazioni con Vista
Salve, uso Ubuntu per imparare a programmare col C, in particolare programmi di number-crunching... Ho provato a compilare un programma per la trasmissione termica che usa il metodo delle differenze finite: il mio problema e' che compilando lo stesso programma con MinGW, la sua esecuzione sotto Vista e' lentissima, in Ubuntu (compilato con gcc) completa il lavoro in 16 secondi, mentre in Vista in 30...
![]() Ps. ho appena provato ad eseguire sotto Ubuntu (con Wine) il programma compilato con VS, e' anche piu' veloce della versione compilata con GCC, completa il lavoro in meta' tempo rispetto all'esecuzione sotto Vista! |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Per avere una comparazione adeguata dovresti usare un compilatore altrettanto efficiente sui due sistemi. Inoltre a seconda dell'implementazione della standard library (e dell'uso che ne fai) i risultati potrebbero variare. Infine i vari anti* presenti su windows potrebbero rallentare l'allocazione/deallocazione di memoria, quindi se fai abbondante uso di malloc e free, questa potrebbe essere una causa.
|
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: May 2009
Messaggi: 9
|
Grazie, in effetti faccio ampio uso di malloc e free. Tuttavia mi sembra strano che lo stesso eseguibile sotto Xp e Linux sia il doppio piu' veloce che sotto Vista. Ho fatto un'ulteriore prova, sul desktop con Xp ho preparato una virtual machine con Vista, e in questo caso le prestazioni restano paragonabili a quelle del host con Xp (solo il 10% piu' lento)! Credo di aver fatto una comparazione adeguata lanciando lo stesso eseguibile sotto Vista, Xp e Ubuntu, e casomai tra i tre dovrebbe essere svantaggiato Ubuntu. Quindi Vista gestisce diversamente l'allocazione della memoria? E provando Vista in una VM con host Xp, la gestione forse viene passata direttamente a quest'ultimo e per questo non si riscontra un tale calo nelle prestazioni?
|
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Mi è appena venuta in mente una cosa molto buffa che avevo riscontrato tempo fa occupandomi di alcune applicazioni per cui le performance erano importantissime: un'elaborazione che normalmente richiedeva 16ms su Vista richiedeva oltre 2s. Anche in quella circostanza c'erano molte malloc/free etc, e avevo osservato che eseguendo come amministratore le performance tornavano ai livelli previsti. Bizzarro, non ho mai capito il perché e non ho perso tempo a indagare, ma magari può esserti d'aiuto.
|
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: May 2009
Messaggi: 9
|
Avviare come amministratore è stata una delle prime cose che ho provato, ma purtroppo nel mio caso non c'è stato alcun miglioramento.
|
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Prova ad eseguire qualche benchmark sintetico su Vista (tipo Sandra o Passmark) e vedi come sta andando la CPU. Verifica che i risultati non si discostino molto da quelli di riferimento per il tuo setup. E magari verifica anche la RAM
|
![]() |
![]() |
![]() |
#7 |
Junior Member
Iscritto dal: May 2009
Messaggi: 9
|
Ho fatto anche questa verifica, col superpi, 1M in 18 secondi, e tempo fa ho provato con Sandra e 3DMark ed era tutto ok. Ho testato la ram con memtest e non da errori, e durante l'esecuzione dei programmi ho verificato con cpuz che la frequenza della cpu sia effettivamente quella massima.
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Nedmalloc
Questo è 120x più veloce del memory allocator di Windows ![]() Potresti provare ad usarlo (tanto è facilissimo, basta sostituire il nome delle funzioni) in maniera di fare un confronto alla pari tra Vista e Ubuntu. Ora cambia completamente il codice del malloc, ed è ovvio che i risultati siano strani... PS: hai provato in Release? Malloc di windows soffre molto il debug. |
![]() |
![]() |
![]() |
#9 |
Junior Member
Iscritto dal: May 2009
Messaggi: 9
|
Si, ho fatto tutto in release. Sto tentando di provare nedmalloc, ho messo tutti i file nella directory del mio sorgente, ho inserito un #include "nedmalloc.c", come nel file di esempio, ho sostituito tutti i malloc con nedmalloc e i free con nedfree, ma compilando in VS mi dice "nedmalloc: identificatore non trovato". Scusate, sono novellino, dove sbaglio?
|
![]() |
![]() |
![]() |
#11 |
Junior Member
Iscritto dal: May 2009
Messaggi: 9
|
Provato co MSVC, funziona! Il tempo di calcolo si è ridotto del 50%, da 29 a 14 secondi! Prima ho provato anche con Hoard, ottenendo gli stessi risultati. Tuttavia non riesco a farlo funzionare da MinGW (uso NetBeans come IDE), ma solo dal MSVC. In particolare mi da errore su tutti i namespace del nedmalloc.h.
|
![]() |
![]() |
![]() |
#12 |
Junior Member
Iscritto dal: May 2009
Messaggi: 9
|
Risolto il problema dei namespace modificando l'estensione del file in .cpp. Tuttavia non compila ancora, mi da "undefined reference to `_InterlockedExchange' " che compare nel malloc.c.h, Qualche suggerimento su come risolvere?
Ps. Grazie a tutti per il prezioso aiuto! |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Non ti so dire come farlo funzionare... io mi son limitato ad inserirlo ed ha funzionato.
Magari, prova a lasciarlo .c e includerlo dentro "extern "C"" Cmq buono che migliora così tanto la situazione... chissà perchè nessuno sostituisce mai l'allocator di windows dato che si hanno miglioramenti "for free"... Ps: il fatto che un allocator più performante ti dà tale vantaggio potrebbe voler dire che il tuo codice spreca malloc e frees... hai provato ad utilizzare del pooling, per riutilizzare la memoria? |
![]() |
![]() |
![]() |
#14 |
Junior Member
Iscritto dal: May 2009
Messaggi: 9
|
Innanzitutto vi ringrazio per l'aiuto! Ho provato ad utilizzare nedmalloc in gcc e funzionava a patto di compilare con l'opzione -pthread. In MinGW pthread non c'è, per questo non funzionava; ho provato poi con dlmalloc, funziona senza problemi in MinGW ed è il più semplice da implementare, è sufficiente includere nel progetto malloc.c e malloc.h. Dlmalloc funziona anche in VS, tuttavia alla terminazione del programma dà l'errore "this application has requested the runtime...", probabilmente va in conflitto col malloc della libreria msvcrt... Alla fine la soluzione più rapida e trasparente per VS si è rivelata Hoard, mentre per MinGW dlmalloc.
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12790
|
Che versione usi di MinGW? La versione stabile usa ancora gcc 3.4.5... quella in DEV mi pare sia la 4.3.x...
In ogni caso tenete a mente che è un porting, e per cui dubito sia molto ottimizzato per Win. Usa il compilatore della Microsoft ![]() |
![]() |
![]() |
![]() |
#16 |
Junior Member
Iscritto dal: May 2009
Messaggi: 9
|
Uso la stable. Si, tra un po' migrerò a VS perché comincierò a smanettare con CUDA, che sotto Windows è supportato esclusivamente da VS. Cmq contemporaneamente cercerò di farlo funzionare sotto Jaunty con l'accoppiata gcc+Netbeans, non appena alla Nvidia forniranno dei driver decenti non-beta che mi danno non pochi problemi sul mio portatile...
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:21.