Newsgroup: it.comp.lang.visual-basic
Titolo: ciclo troppo lungo

Ciao, sono alle prime armi con vb, ho fatto un'applicazione dove faccio
una serie di calcoli e i risultati vengono inseriti in un database
acces salvato su disco il problema è che il ciclo diventa molto lungo.
Come posso fare a velocizzare il calcolo?

 ha scritto nel messaggio 
news:1166017242.4...@l12g2000cwl.googlegroups.com...

posta un po' di codice e vediamo che si può fare...:-)
ciao
fabio 



  La mia sfera magica e' a fare il tagliando per cui non posso vedere
che calcoli fai. Intanto salvi su disco solo i risultati finali o
anche qualcosa di mezzo, rallentando quindi il tutto?
-- 
  Ciao :-)
  Massimo
Nell'indirizzo, sostituire "micio" con "mc"

 ha scritto nel messaggio 
news:1166017242.4...@l12g2000cwl.googlegroups.com...


 Ciao Emiliano.
Sul punto 1 esprimo un mio parere, ma non sò se vale anche in VB6,
anzi il mio intervento è rivolto proprio ad avere un parere del NG.
In VBA ho fatto diversi Test sulla variazione di velocità in relazione
alla tipologia delle variabili e risulta che il Long è più veloce
dell'Integer.
Questo accade perchè VBA(ma è possibile anche VB6) in realtà fa la
conversione implicita degli integer in Long.
La differenza non è pesantissima ma esiste.
Eventualmente faccio qualche prova anche in VB, se non avete già avuto
questo riscontro.
@Alex

La differenza non è pesantissima ma esiste.
La cosa è risaputa, ricordo diversi thread sull'argomento, in particolare
questo, vecchissimo:
http://shorterlink.com/?WRTUR2
--
ciao
  Stefano

SB ha scritto:

Grazie Stefano.
Beh si leggendo tutto il 3D ho ottenuto un risultato paragonabile con
quello di Brando.
Direi che anche se trascurabile è in ogni caso apprezzabile.
@Alex

 Direi che anche se trascurabile è in ogni caso apprezzabile.
Il thread dice che tutto dipende dalla CPU e potrei essere d'accordo.
Tra l'altro da CPU a 32/64bit moderne mi aspetterei maggiore velocita con 
variabili del tipo adeguato.
Ciao 

 ha scritto nel messaggio 
news:1166019408.4...@16g2000cwy.googlegroups.com...


 Concordo dunque, meglio il "long"! :)
E che differenza ci sarebbe tra "a runtime" e "compilato"? :)
Ciao 

{ } Fabio { } ha scritto:

Ciao Fabio ,
    ti invio un po' di codice commentato, scusami ma ho la brutta
abitudine di non mettere i commenti.
Ti ringrazio
Tiziano
'questo ciclo lo utilizzo in una macchina che taglia delle aste di
legno per quadri
'come dati iniziali ho la misura della lunghezza dell'asta = L_asta, la
misura del lato
'corto del quadro =intermedio1 e qella del lato lungo =intermedio2. Lo
scopo di questo
'calcolo è di ottenere il numero di pezzi che devo tagliare del lato
lungo e di quello corto
'al fine di ottenere il minor spreco =Sfido considerando le quantità
dei pezzi da produrre CortiDaFare e LunghiDaFare
'e quelle già prodotte CortoTotale e LungoTotale.
For corto = 0 To (CortiDaFare - CortoTotale)	'(CortiDaFare -
CortoTotale) calcolo il n° di pz. ancora da fare
    Sfrido = L_asta
    For lungo = 0 To (LunghiDaFare - LungoTotale)	'(LunghiDaFare -
LungoTotale) calcolo il n° di pz. ancora da fare
    Sfrido = L_asta
    Sfrido = L_asta - (CCur(lungo) * intermedio1) - _	' qui calcolo per
ogni incremento della variabile lungo e quella corto
            (CCur(corto) * intermedio2)			' lo spreco risultante
        If Sfrido < 0 Then				'quando lo sfrido è maggiore di 0 lo
memorizzo nella tabella access
          Sfrido = L_asta				'se lo sfrido è minore di zero esco dal
ciclo for
          Exit For
        End If
        MioDataEnvironment.rsCustomersTable.AddNew		'Aggiungo nella
tabella un nuovo record
        MioDataEnvironment.rsCustomersTable("Id") = Contatore	'aggiorno
id del record
        MioDataEnvironment.rsCustomersTable!DbSfrido =
Sfrido	'memorizzo il dato sfrido
        MioDataEnvironment.rsCustomersTable!DbA = lungo		'memorizzo il
numero di pezzi lunghi
        MioDataEnvironment.rsCustomersTable!DbB = corto		'memorizzo il
numero di pezzi corti
        MioDataEnvironment.rsCustomersTable.Update		'salvo la tabella
        Contatore = Contatore + 1				'incremento il contatore
    Next lungo
        Sfrido = L_asta - (corto * intermedio2)
        If Sfrido < 0 Then					'se lo sfrido è minore di zero esco dal
ciclo for
          Sfrido = L_asta
          Exit For
        End If
        Contatore = Contatore + 1
Next corto
    TempCorto = 0							'inizializzo delle variabili temporanee
    TempLungo = 0							'inizializzo delle variabili temporanee
    MioDataEnvironment.rsCustomersTable.Sort = "DbSfrido"		'ordino la
tabella secondo lo sfido
    MioDataEnvironment.rsCustomersTable.MoveFirst			'punto il primo
record
    TempSfrido =
MioDataEnvironment.rsCustomersTable("DbSfrido")	'Aggiorno la variabile
che tiene conto dello sfrido
    TempLungo = MioDataEnvironment.rsCustomersTable("DbA")		'Aggiorno
la variabile che indica quanti pezzi devo tagliare del lato lungo
    TempCorto = MioDataEnvironment.rsCustomersTable("DbB")		'Aggiorno
la variabile che indica quanti pezzi devo tagliare del lato lungo
MioDataEnvironment.rsCustomersTable.Close

 Ciao
Il caricamento dell'IDE..... per esempio...!
@Alex

Alessandro Baraldi ha scritto:

OPS ho capito solo ora il qu'_quò_quà....., ho dato per scontato
quello che sicuramente
intendeva Emiliano, quindi ho presunto di intuire proprio la differenza
del caricamento dell'IDE nel caso il test fosse fatto in ambiente di
sviluppo... e con EXE..... sbaglio...?
@Alex

 Il caricamento dell'IDE..... per esempio...!
Ma cosa stai dicendo? :)
Cosa c'entra l'ide adesso?
Ciao 

 Cosa c'entra l'ide adesso?
Ummm... vabbeh, anch'io ho risposto prima di leggere l'altro post :)
Comunque sia se si intende debug vs exe la differenza è che in debug vb6 
lavora in PCode, un po' meno ottimizzato.

 lavora in PCode, un po' meno ottimizzato.
La fretta fà brutti scherzi....
Ma non è in Exe che VB6 lavora in PCODE...???
Access lavora in Pcode con la versione MDE che poi è il fratello
minore dell'Exe VB6...(sopporta questo paragone con tutti i benefici
d'inventario).
;-)
@Alex

 Ma non è in Exe che VB6 lavora in PCODE...???
No, a meno che tu non glielo dica nelle opzioni.
Una volta ho avuto un problema su un exe che non riuscivo a riprodurre con 
il debug.
Alla fine ho risolto consegnando la versione compilata in PCode, cioè come 
lavora il debugger.
Ciao 

 abitudine di non mettere i commenti.
Le variabili!!!
Mancano le dichiarazioni delle variabili!!!
E poi, se l'esempio fosse funzionante magari lo si potrebbe anche valutare 
;)
Ciao 

solitamente il ciclo quanto ci mette?
che PC hai? e in media i lunghi da fare e i corti da fare quanti sono?
=========================



A me sembra tanto che il tuo algoritmo tenti di risolvere un tipico problema di
ottimizzazione, in particolare lo vedrei come una variante del cosiddetto
"problema bin packing" (ossia dati n oggetti di volumi A(n), minimizzare il
numero di contenitori tutti di egual volume B necessari a contenerli).
Se ho capito bene il tuo approccio cerca di considerare tutte le combinazioni
possibili di pezzi lunghi e corti e per ciascuna calcola lo sfrido (= il
materiale che va sprecato), memorizzandolo in una tabella che poi alla fine
ordini per trovare la combinazione corrispondente al minimo sfrido, giusto?
In questo modo sei certo di trovare la soluzione ottimale, ma al prezzo di un
numero molto elevato di iterazioni.
A parte il fatto che probabilmente esistono algoritmi più efficienti di quello
che (empiricamente, immagino) hai implementato tu, secondo me se eviti di
utilizzare un DB per memorizzare i dati intermedi già dovresti ottenere un netto
miglioramento.
Suggerimento: utilizza delle variabili di appoggio che aggiorni ogniqualvolta
trovi un risultato "migliore" di quello precedente, man mano che procedi con
l'enumerazione di tutte le combinazioni. Alla fine dei due cicli for esse
conterranno la soluzione ottimale.
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.