Autor Beitrag
Nuckey
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: So 29.05.11 09:03 
weiss jemand wie die trimmethode der stringklasse funktioniert ?,in bezug speicheralloc.-managment

mfg nuckey


Moderiert von user profile iconChristian S.: Topic aus Sonstiges (.NET) verschoben am So 29.05.2011 um 09:21
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 29.05.11 10:11 
Naja, auswendig gewusst habe ich es nicht, aber wie man im Quelltext sieht geht die von vorne und hinten zeichenweise durch bis der neue Anfang und das neue Ende feststehen. Dann wird mit Hilfe dieser Integerwerte und Copy dieser Teil aus dem alten String herauskopiert.

Also ganz wie ich es erwarten würde.
Nuckey Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: So 29.05.11 10:44 
hmm da bin ich etwas skeptisch,die frage die ich mir stelle ist wie oft alloc. er einen temp. neuen string

ausblenden Quelltext
1:
zb string test = { ( "hallo",100,200) },					


hier im beispiel möchte ich die zeichen '{','}','(',']',',' weg haben ,aber wie genau (relativ gesehen) macht er dieses ?

scannt er voher dehn string ? um dann alle positionen der gefundenen zeichen in einer liste zu speicher um dann von da aus dehn neuen string zu "Berechnen" ?

oder wenn erste zeichen am anfang und ende des strings gefunden wurden ,jeweils dann ein neuer string erzeugt wird.

ausblenden Quelltext
1:
2:
3:
4:
zb.: test = { ( "hallo",100,200) },
     tmp string = ( "hallo",100,200) }
     tmp string = "hallo",100,200)
     Neuer string = "hallo",100,200


mfg nuckey
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 29.05.11 10:47 
Es werden erst alle Zeichen gesucht und am Ende ein neuer String erzeugt, alles andere wäre ja auch Blödsinn.

// EDIT:
Denn schließlich kannst du ja einfach schauen, ob das aktuelle Zeichen in dem übergebenen Arrays drin ist. Und das passiert halt bis der Anfang und das Ende gefunden sind. Wie gesagt.
Nuckey Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: So 29.05.11 12:56 
von der sache her hast du recht ,wäre auch logisch und sinvoll AAABER ,meine frage kommt ja nicht von ungefähr ;)

es ist so ,zur zeit schreibe ich ein programm was texte auseinander nimmt (parsen),anhand eines beispiels möchte ich zeigen wie ich auf die frage gekommen bin.

irgendwo in einer klasse ,tief in einer methode ,nennen wir sie ReadTxt(...) (alles nachvolgende nur als beispiel)

Versuch 1:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
static bool public ReadTxt()

char[] delim = new char[] { ' ', ',' ,'{' ,'}' ,'(' ,')'; // -> " ",{}()

string test = "{( 1000,99,800 )};   // Als ergebniss soll sein "1000,99,800"

irgenwo tief im CODE ;)

string test2 = test.Trim(delim);


gut bis hier her alles prima ,macht was es soll,irgenwan aber wollte ich dehn speicherverbrauch wissen.

der lag bei der "richtigen methode" bei 3129260 byte

nach einigen überlegen kam ich drauf dieses ohne trim zu bewerkstelligen

Versuch 2:
ausblenden Quelltext
1:
2:
3:
4:
5:
string test = "{( 1000,99,800 )};

int pos0 = test.IndexOf("(");
int pos1 = test.LastIndexOf(")");
string test2 = test.Substring(pos0 +1,(pos1 - Pos0)-1).Trim(); // Kleiner Trimm ;)

auch hier maß ich dehn speicherverbrauch und der lag bei 2700592 bytes

und hier kamm mir halt die frage, was passiert beim Trim, das der Speicherverbrauch höher liegt als bei beim 2 versuch.

um die frage vorwegzunehmen wie ich dehn speicherverbrauch maß.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
long mem0 = GC.GetTotalMemory(false);

     ReadTxt();

long mem1 = GC.GetTotalMemory(false);

Console.Writeline("mem {0}",mem1 - mem0);


und daraus schlussfolgere ich das ,beim trimmen etwas mehr passiert als nur das wie du beschrieben hast.


mfg nuckey
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 29.05.11 13:35 
Wenn du Zweifel hast was Trim tut warum schaust du dir Trim nicht selbst an? Lade dir die Debugsymbole runter und debugge durch Trim oder schaue dir den Source zumindest passiv in einem der verfügbaren Decompiler (Reflector, ILSpy, DotPeek etc.) an. Das ist sicher sinnvoller als eine Schlussfolgerung aus einer zweifelhaften Messmethode zu ziehen. Was Trim tut ist sicher vorhersagbarer als das Verhalten von GetTotalMemory. a.) GetTotalMemory liefert laut Doku einen Schätzwert. b.) Hast du denn verhindert das bei beiden Versuchen zwischen den GetTotalMemory aufrufen kein GC-Lauf stattfindet? Nur dann würdest du, zumindest theoretisch, vergleich- und wiederholbare Ergebnisse erhalten. c.) Das Verhalten insbesondere das des GC ist abhängig von der Framework Version, dem Betriebssystem (Server vs. Desktop) und was sonst zeitgleich auf dem Rechner läuft. Also wenn du solche Vergleiche ziehst hast du denn das spätere Zielsystem soweit im Greif das eine Optimierung nach den Spezifika deines Entwicklungssystems nicht eventuell kontraproduktiv für das Zielsystem ist?


Zuletzt bearbeitet von Ralf Jansen am So 29.05.11 13:44, insgesamt 1-mal bearbeitet
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 29.05.11 13:35 
Beitrag gelöscht. Habe es irgendwie geschafft 'antworten' mit 'editieren' zu verwechseln.
Nuckey Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: So 29.05.11 13:48 
hab mir das ganze ohne schnick schnack angeschaut.

erst in einer schleife tritt das phänomen zu tage,habe mir noch mal einiges über GarbageCollekt. durchgelesen und da stand das GarbageCollektor nicht sofort resourcen freigibt sondern erst bei nächst bester gelegenheit ,das würde die sache auch erklären das die temp. resourcen noch nicht freigegeben wurden,dieses aber durch meine 2 routine nicht auftratt, da direkt kopiert wird und somit die differenz zu tage kamm zwischen beiden routinen.

also unterm strich Trim,Trimmt wie es soll ,bloss mit mehr altlast im gepäck.
hmm jetz muss ich nur noch testen ob ein gc.collect() am ende des einlesens sinnvoll wäre.

dank dir nochmal für deine mühe Ralf j. und jänicke ;)

gruss nuckey


Zuletzt bearbeitet von Nuckey am So 29.05.11 13:58, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 29.05.11 13:57 
Hier einmal der etwas gekürte Quelltext:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
    private string TrimHelper(char[] trimChars, int trimType)
    {
      int i = this.Length - 1;
      int j = 0;
...
        for (j = 0; j < this.Length; j++)
        {
...
        }
...
        for (i = this.Length - 1; i >= j; i--)
        {
...
        }
      }
      return this.CreateTrimmedString(j, i);
    }
Was passiert, hatte ich ja schon geschrieben.
Nuckey Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: So 29.05.11 14:02 
dank dir auch sebastian ,hat sich aber soweit geklärt siehe oben ;)

der garbagec. ist schuld ;)

gruss nuckey