Avatar billede thomaxz Nybegynder
15. januar 2007 - 21:12 Der er 15 kommentarer og
1 løsning

minimere hukommelse forbrug

Hvordan kan jeg få mit program til bruge mindre, lige nu bruger det ca. 10 mb i flg. joblisten.

jeg sææter alle mine variable der kan til null når de ikke bruges mere, har ikke kunne sætter hverken int elelr boll til det.

ved iikke om det gør noget, men har ærklære nogle variable globalt for at kunne genbruge dem.

det underlig er når jeg minimere og åbner det op igen, bruge det kun ca. 6 mb.

i nogle funktioner ærklære jeg variabler, bliver der reserverede dobellt som meget memory? hvis funktionen bliver kaldt flere gange?

kort sagt, kan jeg gøre noget for at minimere memoryforbrug, og nogen det ved hvorofr det hjælper at minimere sleve programmet?
Avatar billede kalp Novice
15. januar 2007 - 21:21 #1
nu ved man ikke hvad du har lavet... men brug Structs der hvor du kan
Avatar billede kalp Novice
15. januar 2007 - 21:23 #2
eller lav destructors i dine klasser.
Avatar billede kalp Novice
15. januar 2007 - 21:25 #3
lad være med at gøre følgende f.eks

string tekst = "";
tekst        = "hejsa";

det giver teknisk set 2 strings i ram.. en som er "" og en anden som er "hejsa".

man skal nok se lidt kode for der er sikkert noget iøjenfaldende i den;)
Avatar billede arne_v Ekspert
15. januar 2007 - 22:07 #4
.NET er lavet til dette århundrede ikke til det forrige

10 MB er ingenting

det er ikke engang sikkert at dit program bruger den memory - dit program
allokerer fra .NET runtime og .NET runtime allokeret fra Windows - .NET allokerer
i temmelig store klumper

og lad for guds skyld være med at sætte variable lig null i C# (undtagen under meget
specielle omstændigheder) !
Avatar billede bennytordrup Nybegynder
15. januar 2007 - 22:40 #5
arne >> Forklaring??
Avatar billede ksoren Nybegynder
15. januar 2007 - 22:42 #6
Jeg er også nysgerrig. Hvorfor er det en synd at benytte null?
Avatar billede arne_v Ekspert
15. januar 2007 - 22:51 #7
.NET bruger ikke reference counting, så objekter kan godt blive GC'et selvom
der er noget der har en reference til det

derfor er det i de fleste tilfælde bare forurening af koden at sætte eksplicit
til null

undtagelserne er tilfælde a la:
- erklær reference til
- alloker et meget stort objekt
- sæt reference til at pege på det
- brug det objekt og bliv færdig med det
- fortsæt i meget lang tid hvor reference stadig er i scope

hvor der er en fordel ved at sætte reference til null efter fjerde pind

men den slags tilfælde er ret sjældne i virkelig kode

at sætte lig null er noget som er arvet fra COM, hvor det er vigtigt fordi
COM bruger reference counting.
Avatar billede arne_v Ekspert
15. januar 2007 - 22:59 #8
Avatar billede bennytordrup Nybegynder
16. januar 2007 - 08:03 #9
Så vidt jeg kan se på den blog, så gælder det for lokale variable, der netop går ud af scope, når den function, de er erklæret i, afsluttes.

Jeg vil mene, at det står anderledes til med variable, der ikke er erklæret lokalt.
Avatar billede thomaxz Nybegynder
16. januar 2007 - 09:09 #10
Nu er 10 mb meget, i sær når jeg kigger på avgamsvr.exe min antivurs resident scanner som kun ca. 1 mb.

Også det at ved minimere og åbner mit program et par gange faldr hukommelse forbruge til permant 3,5 mb, det 6,5 mb mindre.

Jeg bruger et XmlDocument objekt hvor jeg indlæser en xml fil, som fylder omkring 60 kb.
Jeg har prøvet at bruge strutc, men syntes ikke det hjalp.
har også et enkelt sted, efter at formenr er færdig med loade og dne køret start procedurene, prøvet at kaldet System.GC.Collect(2); og også prøvet System.GC.Collect();

Men det hjalp heller ikke.
Avatar billede kalp Novice
16. januar 2007 - 10:38 #11
jeg synes da ofte man skal sætte noget = null... ellers får man fejlen.. "use of unsigned xxx".. selv om hvis koden følger det korrekte forløb så vil den være signed på det tidspunkt.

eksempel.

MitObjekt blah;
bool test;
bool koer = true;

if(koer)
{
blah = new MitObjekt();
test = true;
}

if(test)
{
blah.EnEllerAndenMetode(); // FEJL!!
}

men det vil virke hvis man skriver MitObjekt blah = null;


så uanset om vi taler lokal metode eller ej så ville jeg da skrive null i den situation.

men det eksempel du ellers har fundet arne der kan jeg heller ikke se fornuften i at sætte den string = null til sidst.. kan ikke se formålet i det så det er vel logisk nok..
Avatar billede arne_v Ekspert
17. januar 2007 - 02:10 #12
kalp>

det er ikke den slags sætte lig med null vi diskuterer - den har jo åbenlyst ingen
effekt på memory forbrug
Avatar billede arne_v Ekspert
17. januar 2007 - 02:18 #13
thomaxz>

Din antivirus scanner er ikke kodet i .NET !

Jeg har lige lavet et lille eksperiment.

using System;

public class HelloWorld {
    public static void Main(string[] args) {
        Console.WriteLine("Hello world !");
        Console.ReadLine();
    }
}

fylder 4 MB i task manager hos mig

using System;
using System.Drawing;
using System.Windows.Forms;

public class MainForm : Form
{
    private Label lbl;
    public MainForm()
    {
        InitializeComponent();
    }
    [STAThread]
    public static void Main(string[] args)
    {
        Application.Run(new MainForm());
    }
    private void InitializeComponent() {
        lbl = new Label();
        lbl.Text = "Hello World";
        lbl.Size = new Size(100, 25);
        lbl.Location = new Point(25, 50);
        SuspendLayout();
        Controls.Add(lbl);
        ClientSize = new Size(150, 100);
        Text = "Test";
        ResumeLayout(false);
    }
}

fylder 7.5 MB i task manager hos mig
Avatar billede arne_v Ekspert
17. januar 2007 - 02:22 #14
bennytordrup>

Jeg kan ikke se hvor instans variable (non static fields) skulle være anderledes.

De er klar til GC når det objekt der holder dem ikke kan nåes længere.

Fulstændigt svarende til } for lokale variable.

Eneste grund til at sætte null er igen et noget specielt tilfælde:

man sætter en instans variabel til at pege på et meget stort objekt
men skal ikke bruge dette store objekt mere
men man skal bruge det holdende objekt længe endnu

(og det lyder som en design fejl)
Avatar billede arne_v Ekspert
17. marts 2007 - 21:14 #15
Tid at få afsluttet her ?
Avatar billede thomaxz Nybegynder
24. marts 2007 - 19:20 #16
slut
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester