Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Dimensioni Programma

Ragazzi, volevo fare una domanda sulle dimensioni di un programma, visto che
stamattina sono rimasto sconcertato....
E' mai possibile che un Eseguibile di 642 Kb, dopo essere stato lanciato
occupi
la bellezza di quasi 10 MB?
Va be che al suo interno ci sono un po di variabili, ma non sono neanche
tantissime..
Vera domanda del post: Quanto occupano le librerie run-time di Vb?
Grazie 1000, o forse 10MB :))
Ciao
Oz

 ha scritto nel messaggio
news:9f7s9k$2nd94$1...@ID-77238.news.dfncis.de...

E' normale che un "programmone" occupi in ram 10Mb....
La libreria runtime occupa 1,32 Mb (msvbvm60.dll)
Prova a compilarlo con diverse opzioni (Favorisci codice piccolo) oppure in
P-Code, scarica gli oggetti quando non ti servono (Set Object = Nothing),
anche le variabili di testo (A=vbnullstring) e non usare troppe variabili
globali, cerca di usarne solo in minimo indispensabile (soprattutto con
array e variant).
Ciao
--
Timothy Redaelli
timothy.redae...@email.it
------------------------------------------------------------------
Togliere NONSPAMMARE per rispondere

 ha scritto nel messaggio
news:9f7s9k$2nd94$1...@ID-77238.news.dfncis.de...

il problema non è nè la dimensione del programma, nè la dimensione del
runtime vb;
prova a considerare i casi seguenti
Private myArray() As Double
Public Sub myFunc()
    Redim myArray(1 to 1000000) As Double
    ' altre operazioni...
End Sub
oppure
Private myColl As Collection
Public Sub myFunc2()
    Dim i As Integer
    Dim x As myClass
    For i=1 to 30000
        Set x = New myClass
        myColl.Add x
    Next
    '....
End Sub
con situazioni del genere è facilissimo saturare anche tutta la memoria del
PC
ciao

Le sole RUNTIME non tantissimo...
Perň...
Se inizi a usare ADO... anche lě sono mega di librerie... Usi un
controllino... e pure lě... Comunque 10MB mi pare tantino... :)
            Ciao
                        Allanon


Uso Ado logicamente....
Volevo chiedere: se aggiungo un riferimento a qualche oggetto, viene creato
solo quando lo istanzio (ovvero viene occupata memoria) e non per default...
Scarico sempre le Form e gli oggetti, perň non setto a null le variabili di
testo (A=vbnullstring) come detto da "RedaTim", spero non sia grave...
Altra domandina/precisazione:
Nel programma principale (quello da 10Mb per intenderci, 650 Kb) non ho
istanziato oggetti enormi e non ho fatto delle routine tipo quelle scritte
da HellBoy...
Ci sono queste variabili globali:
14 Stringhe
3 Boolean
3 Long
3 Costanti
1 Object
Appena lo lancio mi occupa 10 Mb, poi da esso richiamo una dll Activex di
2,5 Mb (la piů grossa) e la dimensione aumenta di quei 2,5Mb e non di piů...
Uso dei dei riferimenti alla Janus Gridex, ad un oggetto per le gif ma mi
sembrano tanti 10 Mb....
Mi sono reso conto che č molto facile fare pgm enormi con vb...
Ogni riga deve essere scritta con il cervellino se no.....
Ciao
Oz

 Ogni riga deve essere scritta con il cervellino se no.....
Sì, é vero... se vuoi fare un programma da purista é vero...
Però se devi fare un programma per lavoro, lo devi fare in poco tempo... La
mia teoria é: fregatene... E penso che sia anche la logica che muove il
mercato dei PC... ;)
Naturalmente sprecare risorse non é giusto... però non é detto che si debba
sempre fare i puristi... :)
E' una questione di ottimizzazioni...
La mia teoria é:
Se hai una funzione che impiega 1 secondo al posto che 2 centesimi e viene
chiamata solo 1 o 2 volte in seguito ad una iterazione dell'utente... Non te
ne frega niente...
Se hai una funzione che impiega 1 secondo al posto di 90 centesimi, ma può
chiamarsi ricorsivamente 1000 volte... forse qui vale la pena di
ottimizzare... :)
                Ciao
                        Allanon

 ottimizzare... :)
Molto ma Molto giusto...
Forse dovrei anch'io ragionare così :))
Ciao e grazie
oz

 No scherzo, intendi creare tutto con CreateObject(adodb.recordset)?
No, non intendevo così ANZI... odio il late binding... :) Intendevo:
prendere un file e scriverci sopra in modalità binaria... certo, lo so...
era quesi uno scherzo (in realtà io cerco di farle così le applicazioni per
me medesimo...  :))
            Ciao
                    Allanon

 librerie e controlli...
ecco appunto. prova a caricare un db con una dbgrid da 30k righe
(semplici) e schizzi gia' a 15 mb. ho visto in giro exe vb da 7-8 mb,
librerie escluse...

 solo quando lo istanzio (ovvero viene occupata memoria) e non per
default...
viene caricato in memoria solo nel momento in cui istanzi la classe; è
Windows, però, che 'decide' quando rilasciare (per es.) la/e DLL che hai
utilizzato...
es.: tu nei riferimenti hai messo ADO, compili il programma, e lo fai
partire. la msadoxx.dll (o come si chiama) viene caricata in memoria
_appena_ istanzi per es. un oggetto Connection (infatti la prima volta
il caricamento è sempre più lento delle successive).
quando poi fai
MyConn.Close
Set MyConn = Nothing
liberi la memoria allocata per quell'oggetto, ma questo *non* provoca lo
scaricamento della msadoxx.dll: di norma rimarrà caricata nello spazio
di memoria riservato al tuo processo, fino alla chiusura
dell'applicazione
Ciao
Faber


porca vacca!!!! io con le variabili Public ci campo... !!!!!!!
MarioH


auguri !
ciao, hal


perche? sono cosi dannose?
a me servono a indicare uno "status" di un determinato oggetto (ad es., nome
del file attualmente aperto, nome del DB, ...) che devo poter
leggere/modificare in qualsiasi punto del programma.
ogni mio programma inizia con una cinquantina di Public... ::)))))))
attualmente uso molto spesso due variabili Public, un recordset e un command
(si chiama cosi quello delle query parametriche?).
in pratica io dichiaro come Public rst e cmd, all'inizio del programma, come
recordset e command, e poi durante l'esecuzione del programma le uso per
ogni bisogno, ogni volta che devo fare una query non parametrica, scrivo
set rst= (......)
rst poi lo uso per fare quello che mi serve dopo la query, ed è bello e
pronto per un'altra query da qualsiasi altra parte del programma.
idem per cmd. quando devo fare una query parametrica, setto i parametri di
cmd, faccio la query, elaboro i risultati e via...
in pratica rst e cmd sono una specie di SuperPippo, risolvono problemi dove
serve e poi sono pronti a volare altrove in aiuto di qualcun altro...
::)))))))))))
MarioH

perche? sono cosi dannose?
Soprattutto minano alle fondamenta la scalabilita' e la portabilita' del codice.
ciao, hal


taglia, taglia...
:-)
ciao
ugo


ah beh... allora... essendo io un esperto di scalabilità e portabilità...
::))))))))
che roba sono??????!!!!!!!
MarioH

 che roba sono??????!!!!!!!
Scalabilità: la possibilità di ampliare il codice di partenza.
Portabilità: la possibilità di riutilizzare il codice di partenza.
(entrambe senza "traumi"")
(definizioni brevi, non canoniche, scritte così "al volo", ma penso chiare.)
ciao
ugo


ah beh ma allora a maggior ragione servono le variabili public, no?
sono comodissime, e permettono di aggiungere nuove sub e function ovunque,
che si basano su informazioni che non è necessario andarsi a ripescare con
altre sub o function, essendo necessario semplicemente leggere il valore di
tali variabili.
o no?
MarioH

o no?
No ;-)
Ti faccio un piccolo esempio a caso: 
Ho ereditato un gestionalino pieno zeppo di variabili globali
(quando sono dichiarate, perche' l' Option Explicit li' e' un
Optional Explicit <g>).
I pochi form che contiene modellano il proprio comportamento
sulla base di queste variabili globali, con il simpatico effetto
di comportarsi in modo anomalo se, nel frattempo, un form diverso
ha modificato il valore delle var globali per esigenze sue.
Inoltre e' laborioso estrarre parti codice comune, per riutilizzarlo
in un altro progetto, perche'  c' e' sempre qualche riferimento ad
una variabile globale che deve chiamarsi in un certo modo ed essere
stata inizializzata da qualche parte.
Cioe': non e' scalabile e non e' portabile.
un hal che pensa che il vb abbia rovinato schiere di programmatori ;.)


un ugo che pensa che sono pur sempre i programmatori a scrivere i
programmi...
(che poi Vb consenta certi orrori è vero, ma c'è gente che gli orrori riesce
a farli in quelunque linguaggio.)
ciao
ugo

 programmi...
errata corridge:
"che siano"
(prima che a Pal vengano ritti i capelli in testa...)
:-)
ciao
ugo

ugo
buona domenica !
;-) hal

 funzione B a modificare il valore della variabile?
evidentemente se è stata modificata c'era una valida ragione per farlo. non
riesco a scrollarmi di dosso questa visione "razionalista" della
programmazione... ::)))))
faccio 2 esempi.
1) una variabile public che uso sempre è una che chiamo Saved, che indica
(in qualsiasi punto del progrmma ) se un determinato file è stato o meno
modificato. la variabile Saved puo e deve essere modificata in qualsiasi
punto del programma da qualsiasi istruzione che scriva/modifichi/cancelli
dati sul file.
2) spesso interessa sapere da che parte si è arrivati ad una determinata
sub, da dove si è chiamato un form con show, ecc.
ora, o si aggiunge un parametro alla sub (ma mi scoccio di farlo) che dica
appunto chi è il chiamante, oppure si usa una determinata variabile public
cmq effettivamente ammetto che, per chi non ha scritto il programma, puo
essere complicato andarsi a ripescare tutte le variabili public e capire chi
sono , da dove vengono, dove vanno, perche non se ne stanno a casa, ecc.
::))))
pero è anche vero che uno piano piano si affeziona a una tecnica di
programmazione, e poi sono dolori di pancia ad abbandonarla.
io, per es. uso spessissimo Gosub..Return, tutti all'interno di una stessa
Sub, per "verificare" un determinato valore durante l'elaborazione, cosa che
potrei fare tranquillamente con una function... so che è sbagliato, ma ci
sono affezionato (dai tempi del QBASIC), che ci posso fare??????
MarioH

sono affezionato (dai tempi del QBASIC), che ci posso fare??????
ehm, ammetto che lo trovo comodo anch' io (anche se ho cominciato
direttamente con vb5) ...
(della serie: scagli la prima pietra ...)
ciao, hal


ecco... questo decisamente sì.
;-)
ciao
ugo


...omissis...
Sono arrivato un po tardi a leggervi...
Spiacente ma condivido al 100% le osservazioni di Roal e Hal.
Considera che io sono uno che non usava le public neanche in clipper (e le
private solo per macrogenerare i campi).
E considera anche che ho già avuto a che fare una volta con un collega,
bravo per altro, ma che ficcava public ovunque con la scusa che "faceva più
in fretta". Salvo perdere giornate intere perchè una certa procedura di
libreria "stranamente"   "in certi casi poco chiari"   "impazziva"...
Credo sia detto tutto. Intendiamoci, libero di scrivere il codice come ti
pare, ma non mandarlo a me da leggere...
:-)
ciao
ugo


scusa Hal, ma su questo dissento dissociandomi distintamente...
;-)
ciao
ugo

scusa Hal, ma su questo dissento dissociandomi distintamente...
azz ..., vedo gli elettroni che vagano ...


:)))
ciao
ugo
p.s siamo in chat

 ecco... questo decisamente sě.
ma perche parlate cosi male del VB ??
io lo trovo cosě utile... carino... facile... versatile... a tratti direi
"geniale"...
MarioH

 --
-:)
MarioH

 __________________
è tutta colpa mia, si era iniziato con una domanda normale e poi, essendo il
solito invadentone, l'ho personalizzato con le mie osservazioni... ::)))))))
MarioH


Io parlare male di Vb?
Mai letti gli intricatissimi thread Vb vs. Delphy che periodicamente io e il
grande Roal ci scambiamo?
Io parlo sempre benissimo di Vb (quasi), ma vero č che il suo vizio di
consentire soluzioni "improvvisate", alle volte spinge alla pigrizia...
ciao
ugo

 ha scritto nel messaggio
news:aKAS6.28603$vt.2...@news1.tin.it...

Beh, anch'io come "tiratardi" non scherzo...
:-)
ciao
ugo


Un po' di globali a mio parere possono servire, se devo stabilire uno stato
globale all'intera applicazione che puo' essere modificato in qualunque suo
punto, ma la regola dovrebbe sempre essere:
Se una varabile puo' durare il tempo di una funzione, rendila locale alla
funzione
Se una variabile e' utilizzata da una sola funzione, rendila Static della
funzione
Se una variabile e' utilizzata solo all'interno di un modulo, rendila
Private del modulo
Se una variabile e' utilizzata da tutta un'applicazione, cerca un modo di
ridurne lo scope a un modulo, almeno la prima volta che la variabile fara'
un danno non dovrai rincorrerla per tutta l'applicazione...
Se proprio non si puo' fare a meno di rendere globale la variabile, filtrala
attraverso una property, almeno potrai tracciare facilmente i punti in cui
la variabile viene modificata e capire chi la cambia al momento sbagliato
quando (non 'se', QUANDO) succedera'.
Ciaotutti,
Asterix


dai tempo al tempo, e se continuerai a programmare in maniera non banale te
ne accorgerai presto;
se invece vuoi bruciare le tappe, chiudi VB, spegni il PC e studiati un buon
libro di informatica (magari sulla OOP);
ciao


firmo e sottoscrivo
ciao

il "salto di qualita'" nell'arte della programmazione.
Ecco, hai fatto centro :)
ciao, hal

 libro di informatica (magari sulla OOP);
tipo ?