Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Programm stürzt ab, oder rechnet und rechnet
sane
myCSharp.de - Member



Dabei seit:
Beiträge: 21

Themenstarter:

Programm stürzt ab, oder rechnet und rechnet

beantworten | zitieren | melden

Hallo zsm, ich hab ein großes Problem. Ich hab ein Programm geschrieben, dass mir Performance probleme macht. wie wird in C# damit umgegangen? Mit SQL?

Anbei die Architektur zur Veranschaulichung


class Program
    {
        static void Main(string[] args)
        {
            //die folgende List wird  mit tausenden Eintraegen befuellt
            List<Explain> explains = new List<Explain>();

            //Die folgende Liste wird tausenfach durchlaufen. Solche Listen habe ich bis dato nur 2.
            //Das Programm geht mir beim durchlaufen jetzt schon in die Knie. 
            // ich braeuchte aber noch so einige, aber bevor ich das Performance Prblem nicht geloest hab,
            // find ich macht es keinen Sinn weiter zu arbeiten.
            List<Explain> statusList = explains.Where((status) => status.Status == Status.married).ToList();

            for (int i = statusList.Count - 1; i ≥ 0; i--)
            {
                if(true)
                {
                    statusList[i].Condition = Condition.luckyGuy;
                }
                else
                    statusList[i].Condition = Condition.whataLuckyBugger;
            }


        }
    }

    class Explain
    {
        public int Number { get; set; }
        public string Firstname { get; set; }
        public Status? Status { get; set; }
        public Condition? Condition { get; set; }
        
        public Explain(int number, string firstname, Status status)
        {
            Number = number;
            Firstname = firstname;
            Status = status;
        }
    }

    enum Status
    {
        married, divorced
    }
    enum Condition
    {
        luckyGuy, whataLuckyBugger
    }

bedanke mich im Voraus für eure Antworten.
private Nachricht | Beiträge des Benutzers
ClaraSoft
myCSharp.de - Member



Dabei seit:
Beiträge: 52

beantworten | zitieren | melden

Hallo,

Was für eine Exception bekommst du? Stackoverflow, IndexOutOfRange? Bei deinem geposteten Code Schnippsel sollte es so auf dem ersten Blick keine Performance schwierigkeiten geben bzw. ich kann keine erkennen, wenn es nur "paar tausende" Einträge, was ansich schon sehr schwammig formuliert ist, da wäre eine genaue Zahl hilfreicher genauso wie der Fehler und Stacktrace.

Daneben stellt sich für die Frage, hast du es schon mal der Foreach Schleife probiert?

Grüße
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von ClaraSoft am .
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 2.028
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Der Code an sich gibt eigentlich kein erkennbares Problem wieder.
Auch kann anhand des Snippets kaum ein Performance Problem auftreten.
Das du aber tausendfach durch die Liste läuft richt nach einem falschen Ansatz.

Mir ist auch nicht klar wie ein Performance Problem in deinem C# Code mit SQL gelöst werden sollte.
Ggf. fehlt uns hier Kontext, den du erläutern solltest.

Ansonsten wäre es auch hilreich zu wissen, warum du durch die Listen laufen musst.
Suchst du hier nach Einträgen oder musst du ggf. die Einträge ändern?
Wenn diese z.B. aus einer DB kommen, dann kannst du diese mit einem Update Befehl vermutlich sinnvoller updaten als ales einzuladen durchlaufen und dann zurück zu schreiben.

@ClaraSoft
Da er die Liste rückwärts durchläuft, wäre foreach hier nicht hilfreich.
Generell nimmt sich die for/foreach Schleife nur syntaktisch was.
Unter der Haube machen beide das gleiche.

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
sane
myCSharp.de - Member



Dabei seit:
Beiträge: 21

Themenstarter:

beantworten | zitieren | melden

@ClaraSoft, @T-Virus, bedanke mich für eure Antworten!

Ich bekomme keine Fehlermeldungen, obwohl ich immer wieder Fehler in der Programmierung finde, was halt dann zu einem falschen Ergebnis führt.
Es macht für mich auch keinen Unterschied ob ich die Listen von vorne oder von hinten durchlaufe. Bedanke mich aber, dass ihr darauf eingegangen seit, weil ich mir schon die Frage gestellt hab, was denn nun besser wäre.

Ich hab es mir mal durhgerechnet. Aktuell ist die Liste explains mit ca. 1500 Objekten befüllt und ich durchlaufe sie 4000mal. Das führt dazu, dass die Berechnung zwar etwas dauert, aber man kann damit noch sehr gut arbeiten. Ideal wäre aber, wenn ich die Liste mit 100k Objekten befüllen könnte und diese dann 1mio mal durchlaufen könnt. Das würde aktuell dazu führen, dass entweder der Prozess nicht mehr reagiert, oder ich stunden später die Geduld verlieren würde und den Computer aus dem Fenster werfen würde😊

Ich durchlaufe die Listen überprüfe auf Conditions und verändere dann deren Wert je nach Bedingung.
Meine Gedanken, kann so etwas nicht mit grafischer Programmierung verglichen werden? Ich hab in dem Bereich überhaubt keine Ahnung. Schreibe nur, wie ich es mir vorstelle, dass es funktionieren könnte.
Wird da nicht jedem Pixel einen Wert zugewiesen und bei jeder Veränderung alles neu berechnet? Wie werden die Pixel gespeichert? Wie werden sie durchlaufen? Sie arbeiten doch auch mit Millionen an Werten die in Sekundenbruchteilen neu gerechnet werden?

Seit gnädig mit mir, weil ich hab wirklich keine Ahnung wie so etwas funktioniert.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.026

beantworten | zitieren | melden

Zitat von sane
Aktuell ist die Liste explains mit ca. 1500 Objekten befüllt und ich durchlaufe sie 4000mal.
Nich so doll. Je weniger Listen durchlauft werden müssen, desto besser. Deine Liste ist eine simple Abfrage, die aber in der Form nur auf einem Kern läuft.
Mit Hilfe von TPL kann man diese Where-Abfrage sehr einfach und effizient parallelisieren.

Von Micro-Optimierungen halt ich nun mal Abstand.
Zitat von sane
Ideal wäre aber, wenn ich die Liste mit 100k Objekten befüllen könnte und diese dann 1mio mal durchlaufen könnt.
Warum müssen 100.000 Items im Speicher gehalten werden? Warum nutzt Du nicht ein geeignetes Query mittel (eben SQL) dazu?
Datenbanken sind für sowas optimiert.
Zitat von sane
Meine Gedanken, kann so etwas nicht mit grafischer Programmierung verglichen werden?

Nein, eher nicht.
Zitat von sane
Wird da nicht jedem Pixel einen Wert zugewiesen und bei jeder Veränderung alles neu berechnet? Wie werden die Pixel gespeichert? Wie werden sie durchlaufen? Sie arbeiten doch auch mit Millionen an Werten die in Sekundenbruchteilen neu gerechnet werden?
Ist nun Deine Frage, wie Dein Code besser wird und nicht mehr abstürzt, oder wechseln wir das Thema und es geht eigentlich um Pixel?
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 2.028
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Ich verstehe immer noch nicht was dein Ziel ist oder sein soll.
Es macht ohne Kontext erstmal keinen Sinn, dass du 4.000 mal durch die Liste laufen musst.
Wenn dann auch noch Berechnungen mit den einzelnen Einträgen dauern können, wirst du um Wartezeiten nicht drum herum kommen.
Man könnte diese zwar noch mit Ansätzen wie Parallel.ForEach auf möglichst alle Kerne verteilen, aber das löst dein Grundproblem nicht.

Alleine mehrfach durch die Listen zu laufen klingt schon nach einem vollig falschen Ansatz.
Im Bestfall macht man es einmal und führt dann alle Operationen in einem Rutsch aus.
Allein dadurch würde man unmengen an unnützen Iterationen und damit Zeit einsparen.
Ebenfalls würde eine Gruppierung der Listen Einträge z.B. mit Dictionary die Suche dann verkürzen.

Aber ohne Kontext kann dir niemand sagen was du hier sinnvoll als Lösung machen kannst.
Bitte liefere Informationen dazu, damit man dies überhaupt mal beurteilen kann wo der Fehler liegt in deinem Konzept liegt.

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
sane
myCSharp.de - Member



Dabei seit:
Beiträge: 21

Themenstarter:

beantworten | zitieren | melden

danke @Abt, danke @T-Virus für eure Antworten,

@Abt, ich vermute auch, dass das Problem mit einer DatenBank etwas vermindert werden kann. ich hab von SQL halt noch viel weniger Ahnung wie von C#, aber wie mir auffällt kommt man nicht drum herum es zu lernen. das gleiche mit XML.

Nein, ich hab die Pixel nur angesprochen, weil ich dachte, damit vielleicht einen Vergleich herstellen zu können. Bin nicht sehr kreativ ;-)

@T-Virus ich hab bewusst nur so ein Schnipsel gesendet, weil es hat ja niemand lust ein größeres Projekt zu durchforsten.

anbei ein etwas größes Schnipsel ;-)

Ich speichere in der Liste ein ChartMuster, das ich durchlaufen muss, um zu sehen, ob sie etwas geändert hat. darum so viele durchgänge. ich hätte aber auch keine Ahnung wie ich das sonst lösen könnt, da ja alles in weiter Vergangenheit ist. wenn es unmittelbar wäre, wäre das alles kein Problem.

vielleicht hat ja jemand Lust kurz reinzuschauen. Nur Slowly ist relevant.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von sane am .
Attachments
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 2.028
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Und Slowly scheint Update aufzurufen, was nicht in deinem Code enthalten ist.
Auch ist gefühlt 90% des Code generiert und damit für externe Leute wie mich unbrauchbar.

Das ganze geht offensichtlich in die Richtung von Online Trading und Vergleichen von aktuellen Aktien Kursen, da die Namespaces auf NinjaTrader verweisen.
Vermutlich ist dann dein Ansatz mit dem durchlaufen der Liste schon falsch.
Du machst auch je nach Methode ein Where auf deine Listen.
Daduch kommt es unweigerlich bei großen Listen zu langen Suchzeiten.

Vermutlich wäre teilweise ein Ansatz das ganze mit Dictionary zu lösen.
Kannst du dann aber nur für einen Teil verwenden, sobald due mit Werten größer/kleiner suchen musst, funktioniert der Ansatz nicht mehr.

Link:
https://ninjatrader.com/de/

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
sane
myCSharp.de - Member



Dabei seit:
Beiträge: 21

Themenstarter:

beantworten | zitieren | melden

@T-Virus danke für deine Antwort.
Was meinst du damit? Versteh ich nicht.
Zitat
Und Slowly scheint Update aufzurufen, was nicht in deinem Code enthalten ist.
Auch ist gefühlt 90% des Code generiert und damit für externe Leute wie mich unbrauchbar.

muss ehrlich gestehen, dass ich mir durch die Where keine Performance einbußen erwartet hätte
Zitat
Du machst auch je nach Methode ein Where auf deine Listen.
Daduch kommt es unweigerlich bei großen Listen zu langen Suchzeiten.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 2.028
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Am ende muss ja durch Where die Liste beim Materialisieren z.B. mit ToList() oder mit First/FirstOrDefault() durchlaufen werden.
Das kostet eben Zeit, hast du aber selbst schon bemerkt.

List<T> ist bei großen Listen als Container zum suchen nicht mehr praktikabel, da er alle Elemente durchlaufen muss.
Je nachdem wie man darauf sucht, muss er bei nicht gefundenen Treffern immer durch die ganze Liste laufen.
Wenn du schnell suchen willst und auch fixe Kriterien wie einen eindeutigen Key hast, dann nimm Dictionary und gruppiere damit deine Einträge.
Z.B. könntest du deine Enums als Keys verwenden und die Werte im Value als List<MyPrice> speichern.
Bei Änderungen musst du dann die Listen entsprechend bearbeiten.

Nachtrag:
Bezogen auf Update.
Die Methode wird in deinen Gettern aufgerufen und dann die Listen, Trends etc. geliefert.
Diese Methode sehe ich im Code aber nicht, weiß ich nicht was diese überhaupt macht.
Ansonsten sehe ich nur eine Stelle wo deine Preis Liste gefllt bzw. ein MyPrice Objekt hinzugefügt wird.

T-Virus
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am .
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
M.L.
myCSharp.de - Member



Dabei seit:
Beiträge: 308

beantworten | zitieren | melden

Zusatz: bei graphischer Programmierung können auch passende Bibliotheken und Möglichkeiten der Grafikkarte (GPU) genutzt werden. Sinn und Zweck der (parallelen) Berechnungen wird der Rechner aber auch nicht kritisieren.
Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray ;-)
private Nachricht | Beiträge des Benutzers
sane
myCSharp.de - Member



Dabei seit:
Beiträge: 21

Themenstarter:

beantworten | zitieren | melden

@T-Virus, @ M.L , dank euch für eure Antwort,

ich hab nun sehr viele Ratschläge bekommen, vieles zum einlesen.

Ich hab P-Linq schon mal eingebaut gehabt. Die Performance hat sich nicht sonderlich verbessert. Ich hab mir auch die Frage gestellt, ob dadurch auch eine verbesserung entstehen kann, weil ich so gesehen eigentlich nur das gleichzeitig abarbeiten könnte, was auf dem geleichen Preisbereich ist. Werd mal das Dict probieren.

zur Update()

NinjaTrader 8

es ist gut möglich, dass ich diese Methode zuoft aufgeführt hab. Hab mal gelesen, dass sie nur ausgeführt wird,wenn sie benötigt wird. Dann hab ich mir gedacht, rein damit :-))

das folgende steht in der Definition
"Forces the OnBarUpdate() method to be called so that indicator values are updated
// to the current bar. If the values are already up to date, the Update() method
// will not be run."
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von sane am .
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 2.028
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Und in der Dou steht auch dick als Note folgende:
Zitat
Note: This method is only relevant in specific use cases and should only used by advanced programmers

Die Methode manuell aufrufen ist hier vermutlich auch der falsche Weg.
Da du dies in deinen Gettern machst, wird diese auch bei jedem Abrufen der Eigenschaften ausgelöst.
Dadurch tust du dir also keinen Gefallen und verbrennst durch häufige Updates dann zusätzliche Rechenzeit.

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers