Ich mache eine Menge Dateisuche basierend auf einem Kriterium in mehreren Iterationen von meinem Perl-Skript und es scheint 100% der CPU-Zeit zu belegen. Gibt es eine Möglichkeit, die CPU-Auslastung meines Skripts zu steuern? Ich habe irgendwo gelesen, wie ich leere Schlafzyklen in mein Skript lege. Aber ich bin mir nicht sicher, wie ich das machen soll.
Eine gute Möglichkeit, die CPU-Auslastung zu verbessern, ist die Verwendung besserer Algorithmen. Raten Sie nicht, wo Ihr Code all seine Zeit verbraucht: Verwenden Sie einen Profiler. Devel::NYTProf
ist ein fantastisches Werkzeug dafür.
Achten Sie darauf, Amdahls Gesetz im Hinterkopf zu behalten. Beispiel: Ein Teil Ihres Programms verwendet einen quadratischen Algorithmus und Sie könnten ihn mit etwas Mühe durch einen linearen ersetzen. Hurra! Aber wenn der betreffende Code nur 5% der Gesamtlaufzeit ausmacht, kann Ihre heroischste Anstrengung nichts Besseres bringen als eine winzige fünfprozentige Verbesserung. Verwenden Sie einen Profiler, um festzustellen, ob Opportunities für eine größere Beschleunigung an anderer Stelle verfügbar sind.
Sie sagen uns nicht, wonach Sie suchen, und selbst die bekanntesten Algorithmen können CPU-intensiv sein. Beachten Sie, dass der Scheduler Ihres Betriebssystems geschrieben, manuell angepasst, getestet und neu geschrieben wurde, um Systemressourcen effizient zu nutzen. Ja, einige Aufgaben erfordern spezialisierte Scheduler, aber solche Fälle sind selten - noch weniger wahrscheinlich, da Sie Perl verwenden.
Nimm es nicht als schlechtes Zeichen, dass dein Code CPU verbraucht. Sie werden überrascht sein zu erfahren, dass eine der schwierigsten Herausforderungen in Echtzeit-Systemen, in denen die Leistung entscheidend ist, darin besteht, die CPU zu belasten, anstatt im Leerlauf zu arbeiten.
Sie können sleep oder usleep verwenden. Sie können auch die Prozesspriorität verringern.
Aktualisierung: Siehe setpriority ()
schlafen + Zeit + Zeiten kann dies tun.
%Vor% (ungetestet ...) Sprinkle genug relax
Aufrufe in deinem Code und dies sollte sich auf fast oder unter 50% CPU-Zeit ausgleichen.
BSD :: Resource kann dies weniger invasiv tun, und Sie könnten auch Time::HiRes für höhere Präzision.
%Vor% (auch nicht getestet ...) Auf einem System, das dies unterstützt, sollte dies das Betriebssystem bitten, Ihnen alle $interval
Sekunden der CPU-Zeit zu signalisieren, zu welchem Zeitpunkt Sie den Zähler zurücksetzen und schlafen. Dies sollte keine Änderungen am restlichen Code erfordern.
Macht Ihr Skript tatsächlich die ganze Zeit Dinge? Wenn Sie zum Beispiel einen Mandelbrotsatz berechnen, haben Sie Schleifen, die CPU verbrauchen, aber ständig aktiv Daten verarbeiten.
Oder haben Sie Schleifen, in denen Sie darauf warten, dass mehr Daten verarbeitet werden:
%Vor%Im ersten Fall ist die Einstellung der Priorität wahrscheinlich die beste Lösung. Es wird die Berechnung verlangsamen, aber nur so viel wie nötig, um andere Prozesse auf dem System zu bedienen.
Im zweiten Fall können Sie die CPU-Auslastung drastisch verbessern, indem Sie nur für einen Bruchteil einer Sekunde schlafen.
%Vor% Wenn Sie Daten aus einer Quelle ziehen, auf die select
angewendet werden kann, um so besser. Sie können dafür sorgen, dass Ihre Schleife blockiert, bis die Daten bereit sind.
Select funktioniert auf Sockets und Dateigriffen auf * NIX-Systemen. Auf Windows-Systemen können Sie nur für Sockets auswählen.