Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
|
Re: Problem mit & Ohne Threads -Integer Performance
10. Jul 2006, 09:24
Hi,
ich hab mir jetzt mal nicht näher die angehängten Programme noch das Threading der JEDIs angeschaut. Aber was für Erwartungen hast du denn an den Code? Was genau soll denn Threading deiner Meinung nach machen?
Versteh das hier bitte nicht falsch, es sind ernst gemeinte Fragen. Du sagst nicht viel darüber, wieviel Verständnis du in den Grundlagen schon hast. Es ist einfach wichtig zu verstehen, dass ein weiterer Thread nicht mit mehr Perfomance gleich zu setzen ist. Immerhin müssen die Threads auch verwaltet werden (was natürlich eine Menge overhead mit sich bringt). Dann gibt es auch noch konkurrierende Zugriffe auf Variablen (hier lautet das Stichwort Synchronisation) was noch einmal sehr sehr sehr viel Zeit in Anspruch nimmt.
Insbesondere hier kann sich schon die Spreu vom Weizen trennen. Es ist nicht trivial gute Synchronisation zu betreiben. Übersiehst du eine Stelle, lässt sich der Fehler später kaum finden (es ist viel schwerer als bei einem sequentiellen Ablauf). Hier kann es 10.000.000 mal gut gehen und beim nächsten Mal kommt es zu einem anderen Ablauf (der ebend nie vollständig vorhersehbar ist) und der Fehler hat Konsequenzen.
Wird hingegen zuviel Synchronisation betrieben, so kommt es leicht zu dem Problem, dass du hier hast, die Perfomance geht gegen 0. Insbesondere wenn du eine automatische Threadgenerierung verwendest, spricht einiges dafür, dass sie nicht optimal synchronisieren kann.
Für Synchronisation gilt immer :
"So spät wie möglich sperren, so früh wie möglich entsperren"
Wie gesagt ist nicht trivial.
Wichtig ist auch, was für ein Rechner deine Threads bearbeitet. Wenn du nur einen Kern hast, dann kann Threading die keinen Gewinn bringen. Hier kommt es dazu, dass du zwar mehr Verwaltung hast, aber es kann ja keine Last verteilt werden. Hast du mehr als einen Kern (auch auf mehreren CPUs), so kannst du mit deinem Programm auch nur zwei Kerne beschäftigen, selbst hier wäre kein großer Gewinn zu erwarten. Threads sollten immer dort zum Einsatz kommen, wo du wirklich leicht skalieren kannst und/oder es musst. Wenn du zum Beispiel das Zeichnen (was sehr lange dauert, aber auch mit niedrigerer Priorität laufen kann) vom Rechnen trennen möchtest, so kannst du hier Zeit gewinnen.
Baust du einen Server, so kommen sicherlich eine Menge Anfragen, hier kannst du auch jede einzelne von einem Thread bearbeiten lassen. Die Hauptvorteile sollten hier klar sein. Hast du eine Datei, die nicht im Cache liegt, so muss diese von z.B. der Festplatte geholt werden. Müsste an einem Server jeder auf die Ausführung aller Vorgängeranfragen warten, so müsste hier jeder (egal ob für diese Person die Datei benötigt wird) auf das Holen von der Platte warten. Dein CPU arbeitet im Nanosekundenbereich, deine Festplatte im ms Bereich. Das ist ein Unterschied von 10^6, in der Wartezeit kannst du locker eine ganze Menge anderer Dinge (mit der CPU) tun. Würde diese nur warten, würde sie wahrscheinlich ein gutes Weilchen schlafen.
Was Threads angeht, solltest du dir wirklich gut die Theorien dahinter anschauen. Ich glaube Luckie hat auch mal ein Tutorial zu Threads und Delphi geschrieben, such einfach mal danach.
Jedenfalls kommt man ohne die Grundlagen nicht all zu weit. Insbesondere ist es auch nicht so, dass du immer den gleichen Algorithmus für die sequentielle und die nicht-sequentielle Ausführung nehmen solltest. Schon hier können immense Unterschiede in der Perfomance auftreten.
Gruß Der Unwissende
|