Wie kann ich die CPU-Auslastung meines Programms programmatisch auf unter 70% begrenzen?
Spät, ich bin immer mehr auf Gesundheit ausgerichtet als beim Bau von meinem Programm, ich habe beobachtet, dass die meisten Programme nehmen Sie 2 oder 3 Minuten ausgeführt und wenn ich auf den task-scheduler, sehe ich, dass Sie verbraucht 100% der CPU-Nutzung, kann ich die Grenze dieser Nutzung programmgesteuert im code? Dies wird sicherlich ermöglichen es mir, mehrere Programme zu einem bestimmten Zeitpunkt.
Dank,
Nidhi
InformationsquelleAutor der Frage Nidhi | 2009-06-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist nicht deine Sorge... Es ist die Aufgabe des Betriebssystems zu verteilen Prozessor-Zeit zwischen Laufenden Prozesse. Wenn Sie möchten, geben andere Prozesse, die den ersten Riss bekommen, Ihre Sachen erledigt, dann reduzieren Sie einfach die Priorität Ihrer eigenen Prozesse durch ändern der
- Prozess.PriorityClass
Wert.Siehe auch: Windows-Äquivalent von "nett"
InformationsquelleAutor der Antwort Shog9
Dieser thread ist über vier Jahre alt, und es immer noch stört mich, dass die Antwort akzeptiert, kritisiert der Frage statt Sie zu beantworten. Es gibt viele Gründe würden Sie wollen, um die Begrenzung der CPU-Zeit, die dein Programm kann ich die Liste ein paar aus der Spitze von meinem Kopf.
Es mag wie eine Verschwendung, Sie nicht zu verwenden, alle freien CPU-Zyklen zur Verfügung, aber diese Mentalität ist fehlerhaft. Im Gegensatz zu älteren CPUs, die meisten modernen CPUs laufen nicht auf eine Feste Taktfrequenz - viele haben sich Energiespar-Modi, wo Sie drop-Takt und cpu-Spannung, wenn die Last niedrig ist. CPUs verbrauchen auch mehr Energie, wenn Berechnungen durchgeführt werden, als Sie es tun, laufen NOOPs. Dies ist besonders relevant für laptops erfordern, dass der Lüfter zum kühlen der CPU, wenn es unter hoher Last. Ausführen einer Aufgabe zu 100% für eine kurze Zeit verwenden können, weit mehr Energie als das laufen eine Aufgabe, bei 25% für vier mal so lang.
Stellen Sie sich vor Sie schreiben einen hintergrund-task, die entworfen, um index-Dateien in regelmäßigen Abständen in den hintergrund. Sollte die Indizierung Aufgabe verwenden Sie so viel von der CPU, da kann es mit einer niedrigeren Priorität, oder die Drosselklappe selbst zu 25% und dauert so lange wie es braucht? Gut, wenn es verbraucht 100% der CPU auf einem laptop, würde die CPU erwärmen, die fans schmeißen würde, und die Batterie entleeren würde ziemlich schnell, und der Benutzer ärgert sich. Wenn der Indexdienst gedrosselt selbst, der laptop kann in der Lage sein zu laufen mit komplett passiver Kühlung bei sehr niedriger cpu-Taktrate und Spannung.
Übrigens, den Windows Indexing Service jetzt drosselt sich in den neueren Versionen von Windows, die es nie haben, die in älteren Versionen. Ein Beispiel für einen Dienst, der noch immer nicht das Gas selbst, und Häufig ärgert die Menschen, finden Sie unter Windows Installer-Modul.
Ein Beispiel, wie Gas Teil Ihrer Anwendung intern in C#:
InformationsquelleAutor der Antwort Ryan
Könnten Sie schreiben, eine
Governor
Klasse, drosselt die CPU-Auslastung. Diese Klasse enthält eine utility-Methode, die aufgerufen werden soll, die auf einer regelmäßigen basis (z.B., ruft diese utility-Funktion innerhalb einer while-Schleife der Funktion), indem Sie Ihre CPU-bound-Funktion. Der Gouverneur würde prüfen, ob die Menge der verstrichenen Zeit überschritten wird ein bestimmter Schwellenwert, und dann schlafen für einen Zeitraum von Zeit, so dass nicht verbrauchen alle der CPU.Hier ist eine einfache Java-Implementierung aus der Spitze von meinem Kopf (nur so erhalten Sie die Idee), drosseln die CPU-Auslastung auf 50%, wenn Sie eine single-threaded-CPU-bound-Funktion.
Ihre CPU-bound-Funktion würde instanziieren
Governor
und dann rufen Siethrottle
auf einer regelmäßigen basis innerhalb der Funktion.InformationsquelleAutor der Antwort mal
Erstens, ich Stimme mit Ryan, die Frage ist durchaus gültig, und es gibt Fälle, wo die thread-Prioritäten sind nicht ausreichend um alle. Die anderen Antworten erscheinen sehr theoretisch und ohne praktischen nutzen in Situationen, in denen die Anwendung korrekt konzipiert, aber muss noch gedrosselt werden. Ryan bietet eine einfache Lösung für Fälle, in denen eine relativ kurze Aufgabe wird in hoher Frequenz. Es gibt Fälle, jedoch, wenn die Aufgabe nimmt eine sehr lange Zeit (sagen wir eine minute oder so) und Sie können nicht oder wollen nicht, es zu brechen in kleinere Stücke, zwischen denen Sie tun können, die Drosselung. Für diese Fälle ist die folgende Lösung hilfreich sein könnten:
Eher, dass die Drosselung in der business-code, können Sie den Entwurf eines Algorithmus selbst zu arbeiten auf Hochtouren und einfach Gas der thread läuft die operation "von außen". Die Allgemeine Vorgehensweise ist die gleiche wie in Ryan ' s Antwort: Berechnen einer suspension der Zeit auf Basis der aktuellen Nutzung und Aussetzung der thread für diese Zeitspanne vor der Wiederaufnahme wieder. Gegeben einen Prozess, die Sie wollen Gas geben, das ist die Logik:
Der Vorteil dieser Lösung ist, dass das Intervall wird unabhängig von der Dauer Ihres "long running task". Darüber hinaus business-Logik und die Drosselung Logik sind getrennt. Die Spannung/resume-code ist inspiriert von dieser thread. Bitte beachten Sie, dass die Entsorgung und Beendigung der Drosselung muss umgesetzt werden in die Lösung über, es ist nicht für die Produktion von code.
InformationsquelleAutor der Antwort Marc
Wenn Sie ein multi-core-Prozessor, können Sie die Affinität auf jedem Prozess nur die Kerne, die Sie wollen, es zu benutzen. Dies ist die nächste Methode, die ich kenne. Es wird aber nur erlauben, Sie zu ordnen Prozentsätze, die um einen Faktor von 50% auf dual core und 25% auf einem quad-core.
InformationsquelleAutor der Antwort Scott Hunt
Ich denke ehrlich gesagt, dass statt sorgen über das versuchen, zu begrenzen, CPU-Auslastung, indem Sie Ihre app, Sie sollte sich mehr Ihrer Energien auf die Profilerstellung der Anwendung aufzudecken und zu beheben, Engpässe und Ineffizienzen, die eventuell existieren.
InformationsquelleAutor der Antwort itsmatt
Können Sie das Programm in einem thread mit einer niedrigeren threadpriorityder rest ist bis zu Ihrem Betriebssystem. Mit einem Prozess-Essen bis zu 100% Ihrer CPU ist nicht schlecht. Mein SETI ist in der Regel unter alle meine restlichen CPU-Zeit, ohne dass meine anderen Programme. Es wird nur ein problem wenn der thread bekommt Priorität über weitere wichtige Programme.
InformationsquelleAutor der Antwort Carra
Wenn Sie den code überhaupt läuft ist es zu 100%
Ich nehme an, rutschen in einigen schläft auswirken könnten.
Ich wundere mich über die 2-3 minute Abbildung. Ich habe gesehen, dass es auch, und ich nehme an, es ist das laden und initialisieren der Menge der Sachen, die ich wohl nicht wirklich brauchen.
InformationsquelleAutor der Antwort Mike Dunlavey
Danke Euch allen für die Beantwortung. Ich habe auf dieses Ziel hingearbeitet, und die exe läuft es für ein paar Stunden und teilen möchten, um anderen zu helfen. Ich schrieb ein Klasse werde ich einstellen und vergessen in einer WPF-Anwendung, die werden verschlüsseln Sie und drücken Sie Daten in der cloud, aber ich konnte nicht immer haben, es jemals stören das timing, die WPF-app und was die WPF-Anwendung muss in der Art der Ressourcen, die ich werde auch hinzufügen einer Kennzeichnung zu deaktivieren, wenn die WPF-app im höchsten Ressourcenverbrauch Zustand. Ich habe schon sehr threaded diesem WPF mit der TPL. Diese Lösung hat sowohl die Priorität des Prozesses
und der CPU-Prozentsatz begrenzt.
dann in mein mainDisplay.xaml.cs verwende ich
in MainWindow()
Und es gibt keine Fenster aufspringen wenn die exe ausgeführt wird
in das Objekt initalizer
In meiner Anwendung gibt es genügend Zeit, wie 24/7/365, hochladen, viele Daten, darunter Tausende von Bildern, aber die UI muss auch aktiv bleiben, wenn verwendet, und wenn das system läuft, nichts anderes ausgeführt werden können.
InformationsquelleAutor der Antwort Stephen Himes
Wenn es keine andere Aufgabe ausgeführt wird, ist es falsch, dass Ihre app für die Nutzung aller cpu-Kapazität verfügbar ist? Es ist verfügbarwie in ist es da und es ist kostenlos zu benutzen. So verwenden Sie es!
Wenn Sie irgendwie einschränken der cpu-Nutzung Ihre Aufgabe wird es länger dauern. Aber es wird noch dauern, die gleiche Anzahl von cpu-Zyklen, so dass Sie nichts gewinnen. Sie nur verlangsamen Ihre Anwendung.
Tun Sie es nicht. Noch nicht einmal versuchen es. Es gibt keinen Grund, warum sollten Sie.
InformationsquelleAutor der Antwort Treb
Ich denke, was Sie tun müssen, ist zu verstehen, das performance-problem in Ihrer Anwendung, anstatt zu versuchen, eine Obergrenze für die CPU-Auslastung.
Sie Können Visual Studio Profiler, um zu sehen, warum Ihr Antrag ist unter 100% CPU für 2-3 Minuten in den ersten Platz. Diese zeigen, sollten die hot-spot in Ihre app, und dann können Sie in der Lage sein, dieses Problem anzugehen.
Wenn Sie sich Fragen, im Allgemeinen in Bezug auf, wie zu tun Ressource Drosselung in windows, dann kann man sich die "Aufgabe" Objekte, Job-Objekte ermöglicht es Ihnen, Grenzen zu setzen, wie die Satz -, Prozess-Priorität...etc.
Können Sie sich über die Job-objects-Dokumentation hier
http://msdn.microsoft.com/en-ca/library/ms684161(VS.85).aspx
Hoffe, das hilft.
Dank
InformationsquelleAutor der Antwort mfawzymkh
Laut MSDNkönnen Sie nur ein thread-Priorität, d.h.
wo doSomething ist die Funktion, die Sie erstellen möchten ein thead für. Die Priorität können Sie eine der enumeration ThreadPriority Mitglieder
Lowest, BelowNormal, Normal, AboveNormal, Highest
- eine Beschreibung finden Sie in dem MSDN-link oben. PrioritätNormal
ist die Standardeinstellung.InformationsquelleAutor der Antwort Matt