c# und häufiges new



  • Warum glaubst du macht sogar Microsoft ein Dispose.

    http://msdn.microsoft.com/en-us/library/system.drawing.pen.aspx
    Manches gehört in NET händisch gelöscht.



  • Maxi schrieb:

    Sind übermäßig viele new-aufrufe schädlich/verlangsamend,

    ja, ist pöse.
    du erzwingst dadurch viele collections. gen 0 collections sind zwar normal recht schnell, aber viele collections führen im endeffekt auch fast immer dazu, dass auch gen 2 collections unnötig oft gemacht werden müssen, und gen 2 collections sind vergleichsweise langsam.

    oder ist C# dafür wirklcih angelegt, dass man mit Resourcen rumwirtschaftet wie man will und sich auf den GC verlässt?

    funktionieren tut es schon, aber s.o., es wird halt langsamer.

    ---

    bloss... wenn Point3D ein value-type ist, dann müsste es AFAIK egal sein, weil C# den genauso "auf den stack legt", wie man es in C++ machen würde.



  • hustbaer schrieb:

    Maxi schrieb:

    Sind übermäßig viele new-aufrufe schädlich/verlangsamend,

    oder ist C# dafür wirklcih angelegt, dass man mit Resourcen rumwirtschaftet wie man will und sich auf den GC verlässt?

    funktionieren tut es schon, aber s.o., es wird halt langsamer.

    ok, dann werd ich versuchen, das einzudämmen.

    hustbaer schrieb:

    bloss... wenn Point3D ein value-type ist, dann müsste es AFAIK egal sein, weil C# den genauso "auf den stack legt", wie man es in C++ machen würde.

    Point3D ist auch eine Klasse, kein struct oder enum, also liegt sie nciht auf dem stack, oder?



  • hustbaer schrieb:

    Maxi schrieb:

    Sind übermäßig viele new-aufrufe schädlich/verlangsamend,

    ja, ist pöse.
    du erzwingst dadurch viele collections. gen 0 collections sind zwar normal recht schnell, aber viele collections führen im endeffekt auch fast immer dazu, dass auch gen 2 collections unnötig oft gemacht werden müssen

    Warum?



  • Weil Baum!



  • Helium schrieb:

    hustbaer schrieb:

    Maxi schrieb:

    Sind übermäßig viele new-aufrufe schädlich/verlangsamend,

    ja, ist pöse.
    du erzwingst dadurch viele collections. gen 0 collections sind zwar normal recht schnell, aber viele collections führen im endeffekt auch fast immer dazu, dass auch gen 2 collections unnötig oft gemacht werden müssen

    Warum?

    Warum was?

    z.B. weil bei jeder Collection alle "überlebenden" Objekte eine Generation weiter wandern. Dadurch wird die Gen 2 (=letzte Generation) immer grösser, und das Gen 2 Limit wird schneller/öfter erreicht.

    In so gut wie jeder Sprache gilt eben "viel new = viel schlecht", sei's nun mit oder ohne GC.

    Natürlich gilt auch hier wieder die 80/20 Regel - nur damit das jetzt keiner misversteht. Und in vielen Programmen werden die 80 u.U. auch 100 sein.



  • Maxi schrieb:

    In c++ würde einfach ein Objekt auf dem Stack liegen und nach dem Funktionsaufruf ist es wieder freigegeben, in C# ja nicht.

    Selbst in C++ würde ich die Variable hier vor der Schleife erstellen, denn unabhängig von Garbage Collector oder sonstiger Speicherverwaltung sind es einfach weniger Schritte:

    for (int i = 0; i < 10; i++)
    {
        int x = 5;
    
        cout << x;
    }
    

    -->
    int x = 5
    cout << x;
    int x = 5
    cout << x;
    int x = 5
    cout << x;
    int x = 5
    cout << x;
    int x = 5
    cout << x;
    int x = 5
    cout << x;
    int x = 5
    cout << x;
    int x = 5
    cout << x;
    int x = 5
    cout << x;
    int x = 5
    cout << x;

    int x = 5;
    for (int i = 0; i < 10; i++)
    {
        cout << x;
    }
    

    -->
    int x = 5;
    cout << x;
    cout << x;
    cout << x;
    cout << x;
    cout << x;
    cout << x;
    cout << x;
    cout << x;
    cout << x;
    cout << x;



  • Maxi schrieb:

    Point3D ist auch eine Klasse, kein struct oder enum, also liegt sie nciht auf dem stack, oder?

    Nein, Objekte werden auf dem Heap angelegt! Die Referenz auf das angelegte Objekt, die du erhälst, wird auf dem Stack gespeichert!

    Grüße



  • for (int i = 0; i < 10; i++)
        cout <<5;
    


  • Hupf schrieb:

    Maxi schrieb:

    Point3D ist auch eine Klasse, kein struct oder enum, also liegt sie nciht auf dem stack, oder?

    Nein, Objekte werden auf dem Heap angelegt! Die Referenz auf das angelegte Objekt, die du erhälst, wird auf dem Stack gespeichert!

    Grüße

    Value types werden auch direct auf dem Stack angelegt.



  • Jenna J. schrieb:

    Maxi schrieb:

    In c++ würde einfach ein Objekt auf dem Stack liegen und nach dem Funktionsaufruf ist es wieder freigegeben, in C# ja nicht.

    Selbst in C++ würde ich die Variable hier vor der Schleife erstellen, denn unabhängig von Garbage Collector oder sonstiger Speicherverwaltung sind es einfach weniger Schritte:

    for (int i = 0; i < 10; i++)
    {
        int x = 5;
    
        cout << x;
    }
    

    -->
    int x = 5
    cout << x;
    int x = 5
    cout << x;
    int x = 5
    cout << x;
    int x = 5
    cout << x;
    int x = 5
    cout << x;
    int x = 5
    cout << x;
    int x = 5
    cout << x;
    int x = 5
    cout << x;
    int x = 5
    cout << x;
    int x = 5
    cout << x;

    int x = 5;
    for (int i = 0; i < 10; i++)
    {
        cout << x;
    }
    

    -->
    int x = 5;
    cout << x;
    cout << x;
    cout << x;
    cout << x;
    cout << x;
    cout << x;
    cout << x;
    cout << x;
    cout << x;
    cout << x;

    Jeder vernünftige Compiler optimiert dir das, so dass beide Varianten genau gleich schnell sind.

    Variablen immer "so lokal wie möglich", also in diesem Fall innerhalb der Schleife, nicht davor. Warum? Weil's übersichtlicher ist!



  • hustbaer schrieb:

    Variablen immer "so lokal wie möglich", also in diesem Fall innerhalb der Schleife, nicht davor. Warum? Weil's übersichtlicher ist!

    Woher soll ich das auch so genau wissen? Ich komme schließlich aus einer anderen Branche.



  • J. Jameson schrieb:

    hustbaer schrieb:

    Variablen immer "so lokal wie möglich", also in diesem Fall innerhalb der Schleife, nicht davor. Warum? Weil's übersichtlicher ist!

    Woher soll ich das auch so genau wissen? Ich komme schließlich aus einer anderen Branche.

    Das ist auch keine absolute Wahrheit, sondern meine Meinung 🙂
    Davon abgesehen: jetzt weisst dus ja. Ist ja nix passiert... 😕



  • Value types werden auch direct auf dem Stack angelegt.

    wie sind die denn unterscheidbar?? blau-> stack -> grün ->heap ??? seh ich das richtig^;)



  • BorisDieKlinge schrieb:

    Value types werden auch direct auf dem Stack angelegt.

    wie sind die denn unterscheidbar?? blau-> stack -> grün ->heap ??? seh ich das richtig^;)

    Nein.



  • Nämlich structs->stack, Klassen->Heap



  • BorisDieKlinge schrieb:

    Value types werden auch direct auf dem Stack angelegt.

    wie sind die denn unterscheidbar?? blau-> stack -> grün ->heap ??? seh ich das richtig^;)

    nach den farben kann man nicht gehen
    zb ist
    "string" blaub aber
    "String" ist gruen
    intern "zeigt" "string" aber auf "String" - ist also ein und das selbe objekt
    es wird nur "als datentyp" wie int oder double angezeigt

    (int = Int32, short = Int16, long = Int64 usw usf)



  • BorisDieKlinge schrieb:

    Value types werden auch direct auf dem Stack angelegt.

    wie sind die denn unterscheidbar?? blau-> stack -> grün ->heap ??? seh ich das richtig^;)

    Und wieder die Anleitung:

    1. www.google.de
    2. Suchbegriff C# value types
    3. Erster link: http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx

    PS. MSDN really is your friend.

    PSS: Man sollte meinen das Du es langsam mal lernst die C# Referenz zu benutzen.



  • PSS: Man sollte meinen das Du es langsam mal lernst die C# Referenz zu benutzen.

    ersetze das langsam mal durch nie 🤡


Anmelden zum Antworten