for-schleife Prozessorauslastung

Thaxll'ssillyia

Captain
Registriert
Dez. 2007
Beiträge
3.568
Tag, ich programmiere mit C# und hab mit der for-schleife ein Problem im Bezug auf die CPU-auslastung (hab einen Pentium D 2x3,4 GHz) ein Problem.

Die Anweisung beinhaltet, das die for-schleife 10000-mal wiederholt wird. In der Schleife als Anweisung befindet sich eine Berechnung mit Random, die durch ein Befehl an einen Label an den Bildschirm gebracht wird.
Ich stoppe die Zeit für die Berechnung (ca. 50 sec) und schau mir die CPU-Auslastung an, dabei fällt mir folgendes auf:

- Beide Kerne sind meißt zu jeweils 50% ausgelastet, es schwankt aber manchmal zu 30% der erste und 70% der andere Kern, die CPU-auslastung insgesamt wird nie größer oder kleiner 50% (während des Testes natürlich). Ich hab ja nichmal mit Multithreading gearbeitet, wieso 2-Kern-Untertützung und dann max. 50% Auslastung?

- Egal wieviel Berechnungen ich in die for-schleife mache, die Zeit bliebt immer die gleiche, es sind (zumindest auf diesem rechner) immer 50 sec, egal ob 1 Berechnung oder 100...

- Ich hab das Programm mal auf einem anderem Rechner laufen lassen, auf einem Laptop mit Pentium M 1,73 Ghz kam ich auf 55 sek, bei einem rechner mit Athlon 6000+ waren es nur 23 sek.. Also meiner Meinung nach ist der Pentium D deutlich schneller als ein Mobiler Pentium mit 1,73 GHz, das mit dem Athlon kann schon hinhauen...

- Hab mir gedacht, dass es eventuell an der label-Anweisung liegt, die den random an die Anzeige bringt. Hab sie gelöscht, selbe zeit...:freak:

Könnt ihr mir helfen?

Vielen Dank für Hilfe! Gruß AEROON
 
Könnte das sein, dass das Programm/Compiler nur einen Kern unterstützt? Dann würde das auch mit dem Pentium M hinkommen.

Diese Schwankungen von 30-70% kommen daher, dass XP dem Programm immer einen anderen Kern zuweist, d.h, dass XP versucht das ganze zu optimieren. Du müsstest das gleiche Ergebnis bekommen, wenn du im Taskmanager dem Prozess explizit nur einen Kern zuweist.
 
son mist aber auch, kann man mit wenigen Befehlen die for-schleife 100% multicore-fähig machen?
Und das Problem mit der Geschwindigkeit?
 
Stichwort heißt Multi-Threading... wie du schon gesagt hast...
Wobei es gibt so viel ich weiß auch einfachere Varianten ... muss mal schauen...

Schau dir mal die Webcasts von Microsoft zum Thema Multithreading an...
http://www.microsoft.com/germany/msdn/webcasts/finder/default.mspx


Edit: Vorher stand hier noch:
Kommt halt auch auf die Schleife drauf an

Edit2: Und Multi-Threading ist relativ leicht realisierbar in C#, da braucht man keine Libs oO
 
Zuletzt bearbeitet:
Sowas geht normalerweise mit openMP, hab grad mal kurz gegoogelt und habe gesehen, dass es zumindest für VS 2005 noch keine Libs für C# gibt. Kannst ja mal suchen...

Aber wie 1668mib sagt, nicht jede Schleife ist parallelisierbar.
 
Bin wahrscheinlich zu dähmlich, mich auf der Seite zurechtzufinden...

doofe Frage, könnt ihr eine For-schleife mit ungefähr den ober beschrieben Random-Anweisungen + multithreading (wenns überhaupt möglich ist) hier ins Forum posten?
 
Zuletzt bearbeitet:
Oh interessant, da ist C# ja echt praktisch. Hab ich selber aber noch nicht benutzt.

AEROON, du hast jetzt nach keinen 6 Minuten nach der ersten Antwort hier geschrieben, dass jemand für dich die Arbeit übernehmen soll. Wenn dir schon jemand hilft solltest du dir doch auch noch die Mühe machen das dein Problem mit Eigeninitiative zu lösen.
Gib mal bei Google c# und Multithreading ein, bei der Fülle von Tutorials findest du schon was.
 
Dann schau mal bei Galileo computing (ist glaub ich übrigens der oberste Google Eintrag). Die erklären sowas meist gut, sodass man das auch schnell verstehen kann.
 
Besitze das Visual C# 2005-Buch von Kühnel(darf man das sagen oder ist das jetzt Schleichwerbung:eek:), les mir mir den Abschnitt mal durch...
 
Aha, und wieso willst du dich nicht anmelden, wenn man fragen darf?
Weil du eine gültige E-Mail-Adresse angeben musst?
 
Mal unter uns: Microsoft prüft beim anmelden die Lizenz von Windoofs, und falls die nicht stimmt, wirds gesperrt..
 
Ich hab zwar ne echte, aber der Windoofs-updater war da schon mal anderer Meinung -> 30 Tage hatte ich zum sichern, dann wurde Windoofs gesperrt
 
Eine For-Schleife, die Zufallszahlen erzeugt und diese dann am Bildschirm ausgibt, lässt sich nur schwer parallelisieren. Gut, man könnte versuchen, mehrere Thread zu erzeugen, die gleichzeitig in unterschiedliche Labels ihre Ergebnisse posten. Sowas würde letztendlich auch die Gesamt-CPU-Last erhöhen und die Möglichkeiten von Multi-Core-Systemen besser ausnutzen. Text in das gleiche Label zu schreiben, würde Schreibkonflikte verursachen bei deren Synchronisation wahrscheinlich ein noch viel größerer Zeitverlust entstehen würde. Aber: am besten einfach ausprobieren.

Die beschriebenen Schwankungen in der CPU-Last von 30 bis 70% lassen sich durch die üblichen Schedulingverfahren von Windows erklären - irgendwie muss ja Multitasking funktionieren und so kommt jeder Prozess bzw. Thread mal dran, die Ressource (CPU) zu benutzen - nach Ablauf der einer definierten Zeitscheibe kommt der nächste Prozess dran. Usw. halt.
 
Gut, man könnte versuchen, mehrere Thread zu erzeugen, die gleichzeitig in unterschiedliche Labels ihre Ergebnisse posten.

Gut, dann werd ich mich mal umschauen...
 
1.) Nein MS sperrt kein Windows das ist ein hartnäckiges Gerücht. Das einzige, was sie machen ist dieses komische Validation Tool anzubieten, das dann immer schreit und sich nicht mehr deinstallieren lässt. Wenn es bei der nicht mehr gelaufen ist, dann dürfte das an einem unprofessionellen Crack gelegen haben.

2.) Es würde vielleicht einmal helfen den Code zu posten (oder gleich das Projekt anhängen). Wenn du willst kann ich mit der Team Edition einmal den Profiler anwerfen und schauen, wo die Zeit hängen bleibt (bzw. du kannst das selbst, wenn du eine Team Edition hast).

3.) Ich denke einmal, dass das Problem der Zugriff auf ein GUI Element ist. Da helfen mehrere Threads nichts, da die nur aus einem Thread geändert werden können.
 
Zurück
Oben