Punto informatico Network
Login Esegui login | Non sei registrato? Iscriviti ora (è gratuito!)
Username: Password:
  • Annuncio Pubblicitario

VB 2010 Utilizzare piu memoria ram per calcoli

Il forum per tutti i developer. Leggere attentamente il regolamento di sezione prima di postare.

VB 2010 Utilizzare piu memoria ram per calcoli

Messaggioda SuperRomu » ven dic 02, 2011 9:31 pm

Salve,
volevo sapere come è possibile velocizzare i calcoli in vb net, attualmente su un i7 950 mi impiega 7-8ore per portare a termine l'operazione, su un dual core impiega 18ore...
Aprendo il task manager vedo che utilizza solo 20mb di memoria, pero se avvio altre istanze del programma la durata dell'operazione viene incrementata solo di qualche minito. Volevo sapere se è possibile ottimizzare il codice per far sfruttare tutta la ram disponobile al momento.
Grazie
Avatar utente
SuperRomu
Aficionado
Aficionado
 
Messaggi: 147
Iscritto il: mar ago 24, 2004 9:52 pm

Re: VB 2010 Utilizzare piu memoria ram per calcoli

Messaggioda developerwinme » sab dic 03, 2011 9:59 pm

Per poterti fornire un aiuto tornerebbe utile sapere, quantomeno nelle linee generali, di che tipo di calcoli stiamo parlando, perché così è piuttosto difficile capire il problema e tentare di fornire una soluzione. [;)]

Comunque, per come è strutturato il VB.net, ogni oggetto utilizza solo la quantità di memoria che gli è necessaria, quindi non vedo come un aumento del consumo di RAM possa portare ad una diminuzione del tempo di elaborazione, che dal tuo messaggio sembra dipendere soprattutto dalla potenza del processore.
PC: ASUS X53S (Intel Core i7-2670QM 2.20 Ghz, RAM 8 GB, NVIDIA GeForce GT520MX, Windows 8 Pro)
Mobile: Nokia Lumia 710 (CPU 1,4 Ghz, RAM 512 MB, Windows Phone 7.8)
--
developerwinme.wordpress.com
Avatar utente
developerwinme
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 5014
Iscritto il: mar dic 30, 2008 7:00 pm
Località: Como

Re: VB 2010 Utilizzare piu memoria ram per calcoli

Messaggioda SuperRomu » dom dic 04, 2011 2:31 pm

Le combinazioni che vengono generate vanno 500.000 a poco meno di 600.000, i calcoli vengono tutti fatti con degli arrary e se risultano idonei vengono aggiunti a una DataGrid. Il codice viene ripetuto piu volte, non vengono mezionati parametri che fanno direttamente capo ad oggetti nel form.

Nel corso del loop vengono richiamate delle sub-routine ad hoc che generano delle delle risposte.

Era solo un dubbio, perché sto cercando di migliorare il codice per svolgere in meno tempo le operazioni, ma non riesco a trovare una soluzione :(


Routine principale:

imposta parametri per il calcolo attuale...
richiama una subroutine
verifica il risultato della subroutine e se soddisfa i parametri immessi dall'utente esegue un'altra sub-routine e aggiunge il tutto alla datagrid
Avatar utente
SuperRomu
Aficionado
Aficionado
 
Messaggi: 147
Iscritto il: mar ago 24, 2004 9:52 pm


Re: VB 2010 Utilizzare piu memoria ram per calcoli

Messaggioda developerwinme » dom dic 04, 2011 5:33 pm

Per cominciare volevo chiederti alcune precisazioni:
SuperRomu ha scritto:Le combinazioni che vengono generate vanno 500.000 a poco meno di 600.000

Combinazioni di cosa? [uhm]

SuperRomu ha scritto:non vengono mezionati parametri che fanno direttamente capo ad oggetti nel form.

Cosa intendi dire?

Passando al problema, posso darti qualche suggerimento di carattere generale.

1) Il fatto che l'esecuzione contemporanea di più istanze non aumenti in modo considerevole il tempo richiesto mi fa pensare che l'applicazione non sfrutti in modo efficiente i processori multi-core (a proposito, in esecuzione quanto utilizza in termini di processore?), quindi potresti pensare di vedere se è possibile utilizzare la gestione dei thread del .NET Framework per parallelizzare i calcoli e sfruttare appieno i core del processore, con miglioramenti consistenti delle prestazioni.

2) I calcoli con gli array risultano sempre pesanti per la CPU, specie se si parla di matrici a più dimensioni: ove possibile cerca di ottimizzarne e/o limitarne l'uso.

3) Credo che sia già così, comunque te lo faccio notare per sicurezza: il refresh dell'interfaccia grafica durante il calcolo è un'operazione che puoi evitare, effettuandolo al termine delle operazioni, se non rappresenta un problema. A seconda della quantità di refresh della UI che fai, in questo modo potresti guadagnare una buona dose di prestazioni.

4) Numerose chiamate a subroutine, specie se i parametri sono passati ByVal e non ByRef, possono richiedere molto tempo, perché lo stack si riempe e si svuota molte volte: dove possibile potresti cercare di eliminarle (perdendo ovviamente in flessibilità e leggibilità del codice).

5) Se non riesci a migliorare le prestazioni neanche così, potresti pensare di riscrivere il programma in un linguaggio non gestito, come il C++, anche se la cosa potrebbe richiedere molto tempo.

Se hai bisogno di altro resto a disposizione. [:)]
PC: ASUS X53S (Intel Core i7-2670QM 2.20 Ghz, RAM 8 GB, NVIDIA GeForce GT520MX, Windows 8 Pro)
Mobile: Nokia Lumia 710 (CPU 1,4 Ghz, RAM 512 MB, Windows Phone 7.8)
--
developerwinme.wordpress.com
Avatar utente
developerwinme
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 5014
Iscritto il: mar dic 30, 2008 7:00 pm
Località: Como

Re: VB 2010 Utilizzare piu memoria ram per calcoli

Messaggioda SuperRomu » dom dic 04, 2011 9:38 pm

developerwinme grazie per i tuoi utilissimi consigli e spiegazioni!

Le combinazioni in questione sono formate da soli numeri, che se soddisfano dei parametri immessi dall'utente vengono ritenute valide!

Nel post precedente intendevo dire che non vengono richiamati oggetti tipo label, textbox durante l'esecuzione del codice [:-H]

Ti rispondo punto per punto :)
1) L'applicazione in piena funzione usa su un quad-core (i7 950) il 13% della CPU, a questo punto penso che come consigliato da te, si possa ottimizzare con dei thread. Ho letto qualcosa su MSDN ma non ho capito bene [V] Puoi consigliarmi qualche guida, esempio, o anche guide cartacee da comprare?

2) L'uso di array ho cercato di ottimizzarlo al massimo, e putroppo piu di cosi non mi è stato possibile! [cry]

3) Non ho ancora provato a rimuovere il refresh dell'interfaccia, o a mostrare i risultati alla fine, questa è una prova da fare! [^]

4) Alle subroutine vengono inviati parametri ByVal, provvedero a sistemare tutto [^]

5) Elimino questa opzione anche se sarebbe stato meglio pensarci prima! ahaha [fischio]

Provero subito a fare queste modifiche e a vedere se qualcosa è cambiato! grazie ancora per la disponibilità!
Puoi per caso darmi una spiegazione veloce, giusto un'introduzione ai thread? magari anche se puoi darmi qualche consiglio! [grazie]
Avatar utente
SuperRomu
Aficionado
Aficionado
 
Messaggi: 147
Iscritto il: mar ago 24, 2004 9:52 pm

Re: VB 2010 Utilizzare piu memoria ram per calcoli

Messaggioda developerwinme » dom dic 04, 2011 10:06 pm

SuperRomu ha scritto:developerwinme grazie per i tuoi utilissimi consigli e spiegazioni!

[^]

SuperRomu ha scritto:Le combinazioni in questione sono formate da soli numeri, che se soddisfano dei parametri immessi dall'utente vengono ritenute valide!

Non so come devi lavorare su queste combinazioni, ma non potresti salvarli all'interno di stringhe e poi usare le funzioni di manipolazione delle stesse? [uhm]

SuperRomu ha scritto:L'applicazione in piena funzione usa su un quad-core (i7 950) il 13% della CPU, a questo punto penso che come consigliato da te, si possa ottimizzare con dei thread

Credo di si, perché con un uso di quel tipo vuol dire che utilizzi solo una CPU/core.

SuperRomu ha scritto:Puoi per caso darmi una spiegazione veloce, giusto un'introduzione ai thread? magari anche se puoi darmi qualche consiglio!

Non ti so consigliare una guida per il multi-threading, perché io ho imparato (per ora solo una parte) direttamente sul campo con l'MSDN Library, tuttavia puoi trovare un po' di teoria generale sui thread qui, mentre per quanto riguarda il VB.net il punto di partenza è questo. Posso aggiungere che in VB.net ci sono vari modi di implementare il multi-threading e, a seconda delle tue esigenze, dovrai scegliere se avere un controllo minore sui thread, ma maggiore facilità d'uso (BackgroundWorker, consigliato a meno di esigenze particolari) o un maggiore controllo, ma più codice da scrivere e imparare (oggetto Thread). [;)]
PC: ASUS X53S (Intel Core i7-2670QM 2.20 Ghz, RAM 8 GB, NVIDIA GeForce GT520MX, Windows 8 Pro)
Mobile: Nokia Lumia 710 (CPU 1,4 Ghz, RAM 512 MB, Windows Phone 7.8)
--
developerwinme.wordpress.com
Avatar utente
developerwinme
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 5014
Iscritto il: mar dic 30, 2008 7:00 pm
Località: Como


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

Powered by phpBB © 2002, 2005, 2007, 2008 phpBB Group
Traduzione Italiana phpBB.it

megalab.it: testata telematica quotidiana registrata al Tribunale di Cosenza n. 22/09 del 13.08.2009, editore Master New Media S.r.l.; © Copyright 2008 Master New Media S.r.l. a socio unico - P.I. 02947530784. GRUPPO EDIZIONI MASTER Spa Tutti i diritti sono riservati. Per la pubblicità: Master Advertising