[ Bope @ 26.08.2006. 19:54 ] @
Jedan program koji sam jos davno napravio u VB6 sam prepisao u C#,optimizovao ga ali imam problem:Prilikom izvrsavanja on zauzima 21MB Rama!!!!
Isti program,potpuno ne optimizovan i pocetnicki pisan u VB6 zauzima samo 3 MB-a.Kako????

Iskljucio sam VisualStyles,program pokrecem preko Application.Run() (znaci prozor se ne prikazuje,program radi u pozadini),program ima jednu listBox i 2 FileSystemWatcher-a,60 linija koda i koristi System,System.Diagnostics,System.Drawing,System.Windows.Forms i System.IO.

Sta trebam da ucunim,kako da smanjim potrosnju memorije?Da li je C++ sudjen?

P.S. program sam pisao u #develop-u 2.0 (dok VS kompajlira,dok pokrene,dok ugasi mogu da odem da jedem).
[ aleksandarpopov @ 26.08.2006. 21:03 ] @
Nije problem u nacinu pisanja vec su programi radjeni/kompajlirani u C# su izvrsivi jedino preko .NET frameworka, nesto kao virtuelna masina, nesto izmedju tvoje masine i tvog programa, sto zauzima dosta memorije. Ako ti je bitna kolicina memorije uzmi neki alat / kompajler koji kompajlira u masinski kod c/c++ ili delphi.
[ Bope @ 26.08.2006. 21:49 ] @
bedak....stvarno ne znam sta mi bi da se posvetim C#-u....
Cim mi neki principi OOP-a "udju u ruku" prelazim na ++
[ Shadowed @ 26.08.2006. 21:52 ] @
Stvar je u tome da kod malih aplikacija zaista ume da bude nezgodno, dok kod vecih (a dobro napisanih) razlika nije tako dramaticna.
Medjutim, tih 21MB je zaista deluje malo previse ali to naravno zavisi sta tvoj program radi.
[ Bope @ 26.08.2006. 22:07 ] @
Sad sam probao u C++-u .NET i o5 sam se razocarao-obican prazan prozor,bez
obzira na visualstyles uzima 30 Rama....
Kad sam vec kod ++-a da li mogu da mu kazem da ne pravi "VC++ Intellisense
Database" pri pravljenju projekta jer je taj fajl i kod prostih aplikacija
veliki po nekoliko MB-a?
Da li je to neki kljucan fajl ili moze da se zaobidje/smanji?
[ spartak @ 27.08.2006. 01:04 ] @
Napises mali program sa jednom formom, on uzme 20tak mega.

Onda dodas jos 40 formi, a program bude 30tak mega.

Nema tu velike drame, stara prica o kornjaci i zecu. Koliko se secam, svaki put kad sam je citao kornjaca je dobila.

Evo ja sam upalio sw na kojem sad radim. Unutra ima 4 vrste 3rd party kontrola (C1, Plexity, RemObjects, DevExpress), jedan deo tabela se puni pri startovanju programa. Ukljucio sam nekoliko formi, sa sto tezzim kontrolama i koje vuku podatke i oko 60tak mega.. dalje nije maklo. Outlook zgazi u cugu 30 mega.
[ Bope @ 27.08.2006. 03:15 ] @
Ja sam imao ovakav problem: kad sam pisao pomenuti program u basic-u hteo
sam (i uspeo) da napravim poseban mali program koj i radi neku jednostavnu
operaciju (npr pretragu foldera koji dobije preko command line-a) i koji
glavni program na pocetku pokrene recimo 40 puta (za 40 razlicitih
foldera).Cilj mi je bio da tih 40 malih programa rade paralelno...U C#-u sam
odustao od tog resenja jer 40x20 MB rama je mnogo :)

Hteo sam da napravim nesto slicno u C#-u ali sam pre par sati shvatio da
nema svrhe i da postoje bolji nacini ali me jos uvek zanima da li u C#-u
postoji nesto pomocu cega mogu da kazem da se dve linije koda istog programa
izvrsavaju paralelno?
[ bjevta @ 27.08.2006. 06:41 ] @
1. bope, pogledaj malo taj algoritam. imam utisak da bi to moglo i malo bolje.

2. istovremeno "kopanje" po disku od strane više programa degradira performanse svakog od njih. poželjno za izbegavanje.

3. za paralelno izvršavanje pogledaj Thread klasu

[ Shadowed @ 27.08.2006. 08:29 ] @
To se ionako nece zaista istovremeno izvrsavati tako da je jednostavnije da u jednom programu vrsis pretragu folder po folder. Tj. manje ce resursa trebati i brze ce biti zavrseno.
[ TheAlas @ 27.08.2006. 12:36 ] @
Moraš da budeš vrlo vešt sa memorijom i performansama u svim okruženjima, pa tako i u C#, a o c++ da ne pričam. Radio sam i u VB6, on dobro upravlja memorijom ako znaš šta radiš.

Ja sam pravio mnogo malih aplikacija u C# koji rade u pozadini. Samo WinForms zauzima minimum 1.5MB, tako da ako je prozor VIDLJIV na ekranu tvom programu se dodaje tih minimalnih 1.5MB.
Moja najveća mala aplikacija u C# je jedan IRC bot koji ima oko 4500 linija koda, korsiti ADO baze, i "baferuje" velike količine podataka. Kada je prozor (sa 5-6 osnovnih komponenti) sakriven, program zauzima 1.6MB memorije + 2.5MB punog bafera koji se puni duže vreme.

Kada praviš aplikaciju u C++ bez MFC-a, možeš preko kalkulatora i izvornog koda da izračunaš koliko će memorije zauzeti tvoj program, tako da tu nema tajni. A sam MFC dodaje oko 2MB.
Moj IconMasterXP je pravljen u C++ 7.1, koristi poslednji MFC, i zauzima samo 5-10MB. Inače ceo program ima oko 25 000 linija koda, što naravno ne utiže na RAM zauzeće ni malo. Kao što rekoh, možeš i u glavi da proceniš koliko će ti zauzeti program, ako zauzima više - onda si neku gadnu grešku napravio. VS 7.1 i dalje verzije imaju mogućnost automatske detekcija leak-ova u klasama, tako da koristi OOP ako ne 100% onda 99%, tvoj program će biti zahvalan. Takođe, mislim da ljudi prave grešku kad veruju da su stare Win32 aplikacije imale mnogo bolju organizaciju memorije nego današnji "virtualni" programi, upravo je suprotno.

Zaboravio sam da napomenem da je .NET 2.0 druga priča - generalno, više zauzima od 1.1.


[Ovu poruku je menjao TheAlas dana 27.08.2006. u 14:02 GMT+1]
[ Bope @ 28.08.2006. 02:11 ] @
Evo napravio sam sta sam hteo-program ima 4 form-e i kad radi zauzima 26 MB
rama.
[ bjevta @ 28.08.2006. 07:18 ] @
kako framework radi garbage col. u sledećoj situaciji:

imamo dve klase i njihove instance (A i B, na primer). objekat A ima referencu na objekat B preko nekog property-ja a i objekat B ima referencu na objekat A preko svog property-ija. drugim rečima, objekti A i B se uzajamno referenciraju.

treba uništiti oba objekta - recimo da nam više ne trebaju. hoće li ih gc počistiti iako su još uvek referencirani?
[ negyxo @ 28.08.2006. 08:58 ] @
Hoce ukoliko su samo medjusobno bili referencirani, ako niko vise ne drzi njihove reference. GC cisti objekte tako sto krece od root-a aplikacije pa na dalje. Ukoliko niko od ovih prethodnih "parent" objekata ne drzi referencu na tvoj objekat GC smatra da se objekat vise ne koristi. Uostalom evo dobar tekst o tome kako GC radi na http://msdn.microsoft.com/msdnmag/issues/1100/gci/

E sad vidim da ovde svi iznose neke svoje informacije o tome koliko .NET zauzima meomorije na osnovu, pa ne znam tacno kojih ocitavanja ali pretostavljam preko task managera (za one koji preko TM ocitavaju - minimizirajte aplikaciju pa onda pogledajte koliko zauzima )

Mali savet
ko god hoce da gleda neki performance monitoring neka koristi neki specijalizovani program za to ili neka koristi performance monitor u win-u (perfmon.exe) a isto bi preporucio za .NET aplikacije jedan mali programcic CLR Profiler koji je odlican za ove stvari, ima lepe boje

@Bope
Ukoliko vec hoces da imas vise instanci tvoje aplikacije mozda bi trebalo da razmislis da koristis ngen umesto JIT-a tj. da kreiras ngen image (dolazi uz .NET SDK). Ovako ces dobiti malo na performansama i ustedeces memoriju (tako bi trebalo).





[ Bope @ 28.08.2006. 09:04 ] @
Ja mislim da hoce.Ako su reference deklarisane u,npr button1_click metodi
onda sam siguran da hoce,cim se izvrsi button1_click.
Jel to bio bit pitanja ili....?
[ Bope @ 28.08.2006. 09:09 ] @
sto se minimiziranja tice: Jaaako interesantno! pre prvog minimiziranja
uzima oko 20 Mb-a,kad minimiziram zauzima oko 13 ali kad je ponovo vratim u
normal zauzima 15 (a ne 20)!
?????
O cemu se radi?