Kontrolle ein perl-Skript ist die CPU-Auslastung?
Bin ich dabei eine Menge von Datei-Suche auf der Grundlage eines Kriterien in mehreren Iterationen aus meinem Perl-Skript, und es scheint, nehmen die bis zu 100% der CPU-Zeit. Gibt es eine Möglichkeit zu kontrollieren, mein Skript CPU-Auslastung? Ich habe irgendwo gelesen, darum, die leeren Schlaf-Zyklen in meinem Skript. Aber ich bin nicht sicher, wie dies zu tun.
- Diese ist Plattform-abhängig. Auf welchem Betriebssystem laufen Sie auf?
- Wenn es keine anderen Prozesse müssen die CPU, warum sollte er es zulassen, Abfälle guten Zyklen, wenn Sie sinnvoll genutzt werden ??
- Ich bin mit meinem Skripten unter Windows. Ja, es gibt andere Prozesse, die laufen auch. Ich war weniger aufdringlich mit meinen Skripten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie senken könnte der Prozess (Perl) Priorität zugeordnet OS: windows oder linux
Beispiel für niedrigste Priorität:
windows
linux
Eine großartige Möglichkeit zur Verbesserung der CPU-Auslastung ist die Verwendung von besseren algorithmen. Sie müssen nicht raten, wo dein code ist, alle Ausgaben seiner Zeit: einen profiler verwenden.
Devel::NYTProf
ist ein fantastisches Werkzeug für diese.Werden Sie sicher zu halten Amdahl ' s law in den Sinn. Zum Beispiel, sagen ein Teil von Ihrem Programm verwendet einen quadratischen Algorithmus und mit etwas Mühe könnten Sie ersetzen Sie es mit einem linear ein. Hurra! Aber wenn der code in Frage, macht nur 5% der gesamten Laufzeit, Ihre heroischen Anstrengungen bringen kann, nicht besser als eine kleine fünf-Prozent-Verbesserung. Einen profiler verwenden, um zu bestimmen, ob Chancen für mehr Beschleunigung verfügbar sind anderswo.
Du uns nicht sagst, was du suchst, und sogar die besten bekannten algorithmen kann die CPU-intensiv. Bedenken Sie, dass Ihr Betriebssystem scheduler geschrieben wurde, von hand abgestimmt, getestet und neu geschrieben, um die Systemressourcen effizient. Ja, einige Aufgaben erfordern spezialisierte Planer, aber solche Fälle sind selten—noch weniger wahrscheinlich, gegeben, dass Sie mit Hilfe von Perl.
Nehmen Sie es nicht als ein schlechtes Zeichen, dass der code frisst CPU. Sie werden vielleicht überrascht sein zu erfahren, dass eine der härtesten Herausforderungen in realtime Systemen, wo Leistung entscheidend ist, ist, dass die CPU beschäftigt, anstatt im Leerlauf.
Könnten Sie schlafen oder usleep. Eine andere Sache, die Sie tun können, ist niedriger die Priorität.
Update:
Sehen setpriority()
setpriority
Funktion ist nur ein wrapper um die system-call mit dem gleichen Namen. Als solche, es ist ein fataler Fehler zu nennen, es auf Plattformen, die nicht umzusetzen (z.B. Windows).setpriority()
ist nicht implementiert in Windows.Nur schlafen:
oder etwas mehr Phantasie, tun N Operationen pro Schlaf-Zyklus:
schlafen + Zeit + mal kann ein bisschen tun.
(Ungetestet...) Streuen genug
relax
Anrufe gesamten code und dieser sollte durchschnittlich aus, um in der Nähe von oder unter 50% CPU-Zeit.BSD::Resource können dies tun, weniger invasiv, und Sie könnte als gut greifen Time::HiRes für höhere Präzision.
(Auch ungetestet...) Auf ein system, das es unterstützt, diese Fragen sollte das Betriebssystem signal, das Sie jeden
$interval
Sekunden CPU-Zeit, an welcher Stelle Sie den Zähler zurücksetzen und schlafen. Dies sollte nicht verlangen, änderungen an den rest des Codes.Ist Ihr Skript tatsächlich die Dinge zu tun die ganze Zeit? Zum Beispiel, wenn Sie die Berechnung einer mandelbrot-Menge, Sie haben Schleifen, die CPU, sondern sind aktiv auf der Verarbeitung von Daten die ganze Zeit.
Oder haben Sie Schleifen, wo Sie darauf warten, für mehr Daten zu verarbeiten:
Im ersten Fall die Einstellung der Priorität ist wahrscheinlich die beste Lösung. Es wird sich verlangsamen die Berechnung, aber nur soviel wie nötig service andere Prozesse auf dem system.
Im zweiten Fall verbessern Sie die CPU-Auslastung drastisch durch den Schlaf nur für einen Bruchteil einer Sekunde.
Wenn Sie Daten von einer Quelle, die
select
angewendet werden können, um so besser. Die können Sie gerne für Ihre Schleife blockiert, bis Daten bereit sind.Wählen Sie arbeitet auf sockets und Datei-handles, die auf *NIX-Systemen. Auf Windows-Systemen können Sie nur wählen, gegen Steckdosen.