Laden...

Aufzählungsprobleme

Erstellt von bonnet vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.470 Views
B
bonnet Themenstarter:in
107 Beiträge seit 2006
vor 17 Jahren
Aufzählungsprobleme

Hallo,

ich bin gerade bei der Geschwindigkeitoptimierung meiner cf-anwendung. Jetzt habe ichs auf Casting abgesehen und stehe vor einem problem. ich habe eine arraylist, wobei die member einer eigenen klasse angehören:



class MyClass
{
public bool IsResult;
}


Wenn ich jetzt eine bestimmte menge aus der arraylist zurückgeben will, mach ich das momentan folgendermaßen:


...
public ArrayList GetAPieceOfList()
{
res = new ArrayList();
foreach (MyClass mc in MyList)
{
if (mc.IsResult)
{
res.Add(mc);
}
}
return res;
}
...

Soweit so gut, nur muss man das einzelne Objekt doppelt casten, einmal die filterfunktion, zum anderen der Aufrufer, da er ja ne Arraylist zurück bekommt.

Also wäre ja als Rückgabe ne Auflistung (MyClass[]) ideal, so machen das ja auch die meisten Funktionen im Framework.

Nur wie soll ich das anstellen, da ich nicht vorher weiß wieviel Datensätze in die Rückgabe reinkommen und ich die Kapazität der Auflistung bereits anfangs festlegen muss.
Da müßte ich erstmal in der Liste schauen wieviel Datensätze es sind (1. casting) und anschließend die liste füllen (2. casting).
Also hab ich nix gekonnt - gibt es da ne elegantere (bessere) Lösung?

Und noch ne Frage am Rande, wie bekommt ihr es hin, dass euer Quelltext im Forum die Tabs mitbekommt?

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo bonnet,

du solltest die Performance nur da optimieren, wo sie zum Problem wird oder werden kann. Es ist nicht sinnvoll global zu optimieren. Normalerweise gibt es in eine Anwendung ganz wenige "Hotspots", die die Performance fressen und bei deren Optimierung man die Anwendung spürbar beschleunigen kann. Diese Hotspots findet man mit einem Profiler.

Anonsten: warum verwendest du nicht List<T> bzw. IList<T>?

herbivore

B
bonnet Themenstarter:in
107 Beiträge seit 2006
vor 17 Jahren

Danke für die schnelle Antwort

du solltest die Performance nur da optimieren, wo sie zum Problem wird oder werden kann. Es ist nicht sinnvoll global zu optimieren. Normalerweise gibt es in eine Anwendung ganz wenige "Hotspots", die die Performance fressen und bei deren Optimierung man die Anwendung spürbar beschleunigen kann.

Schon klar, aber ich glaube bei der ANwendung zählt jedes Quäntchen.
Die Anwednung läuft auf einen Barcode Scanner, und in einen Arbeitsgnag müssen die Mitarbeiter Artikel zählen. Die Leute sind aber dermassen schnell beim Scannen, das schon das sichtbamachen eines Formulars zum Problem wird.

Diese Hotspots findet man mit einem Profiler.

Gib es irgendwo ne Anleitung oder kannst du mich Stichworte nennen was ich fürs CF benutze kann und wo ich ansetzen muß?

Anonsten: warum verwendest du nicht List<T> bzw. IList<T>?

Wenn ich ehrlich bin: Wegen des Aufwandes. Ich hab noch nie mit generischen lsiten gearbeitet, habe festgestellt das keine sort methode implementiert ist (und shcon 1000sende IComparer geschrieben) - einen enormen zeitdruck, da das projekt schon ne weile überfällig ist - und nicht auf Anhieb gefunden wie das geht, also hab ich sein lassen...

Aber vielleicht muss ich mir doch die zeit nehmen.

L
497 Beiträge seit 2006
vor 17 Jahren

Nur der Vollständigkeit halber: Um dennoch dynamisch MyClass[] anzulegen, würde man die Schleife wohl zweimal durchlaufen. Beim erstn Mal zählen wieviele Einträge es werden, dann das neue Array mit der errechneten Größe anlegen und dann im zweiten Durchlauf die Elemente hinzufügen.

Original von bonnet
Und noch ne Frage am Rande, wie bekommt ihr es hin, dass euer Quelltext im Forum die Tabs mitbekommt?

Im Editor einstellen, dass Tabs als (2 oder 4) Leerzeichen gelten sollen. Dann gibt's auch keine Probleme mit dem Öffnen in anderen Editoren.

Sarkusmus ist, wenn nichts mehr hilft, außer Lachen.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo bonnet,

Schon klar, aber ich glaube bei der ANwendung zählt jedes Quäntchen.

kann ich mir nicht vorstellen. Eine einzelene Anweisung, die nicht in einer engen Schleife steht, wird z.B. fast nie performancekritisch sein.

Wegen des Aufwandes.

Der Aufwand ist minimal und auf jeden Fall geringer als bei Verwendung der nicht generischen Typen wie Arraylist.

habe festgestellt das keine sort methode implementiert ist

Das stimmt nicht! Sort ist implementiert, auch in allen Überladungen, die man barucht.

herbivore

B
bonnet Themenstarter:in
107 Beiträge seit 2006
vor 17 Jahren

@LordHessia

Im Editor einstellen, dass Tabs als (2 oder 4) Leerzeichen gelten sollen. Dann gibt's auch keine Probleme mit dem Öffnen in anderen Editoren.

Ist im Quelltexteditor auch eingestellt, kopier ichs hier ins Forum sind die Tabs ääh Leerzeichen auch noch da, nur nach dem senden sind sie weg.

@Herbivore

Das stimmt nicht! Sort ist implementiert, auch in allen Überladungen, die man barucht.

Natürlich hast du recht, hatte wohl vergessen warum ichs nicht hinbekommen hab. Das Problem war, da es sich um eine Multithread Anwendung handelt und mehrerre Threads auf die Liste zugreifen arbeite ich mit ArrayList.Synchronized() - was ich mit generischen Listen nicht geschafft habe.

kann ich mir nicht vorstellen. Eine einzelene Anweisung, die nicht in einer engen Schleife steht, wird z.B. fast nie performancekritisch sein.

ich gehe gerade den langen steinigen weg und schau mir noch mal alles an. Das Hauptproblem sind die Webservices, welche alle paar Sekunden die offline Daten mit den aktuellen vergleichen. da hab ich aber nicht viel einfluss - also versuche ich die den Listenzugriff zu beschleunigen, da ja alles mit den zentralen Daten arbeitet.

T
512 Beiträge seit 2006
vor 17 Jahren

Du wirst die Laufzeit kaum verbessern wenn du ein Array statt ArrayList verwendest.

Du könntest sie z.B. (sehr geringfügig) verbessern, wenn du dem ArrayList gleich am anfang genügend Platz zuweist (Capacity). Da helfen idealerweise stochastische Verfahren (Konfidenzintervalle) oder einfach gutes Schätzen.
Ich meine ein ArrayList mit Kapazität 10 verhält sich ziemlich genauso wie ein Array mit Größe 10, nur dass die ArrayList eventuell noch wachsen kann ohne den Käse selbst implementieren zu müssen.

Ansonsten wenn die Funktion so oft gebraucht wird, wäre es vieleicht ne Überlegung wert die zwischenzuspeichern und nur bei Änderungen neu zu berechnen, bzw. Änderungen direkt über Events einzuarbeiten.

e.f.q.

Aus Falschem folgt Beliebiges