Gibt es eine Möglichkeit, ein C ++ - Programm langsamer auszuführen, indem Betriebssystemparameter unter Linux geändert werden? Auf diese Weise möchte ich simulieren, was passieren wird, wenn dieses bestimmte Programm auf einem wirklich langsameren Computer ausgeführt wird.
Mit anderen Worten, eine schnellere Maschine sollte sich für dieses bestimmte Programm wie eine langsamere Maschine verhalten.
nice
ist ein Befehl, der die Planungspriorität senkt. Variieren Sie alt, relativ grob. Sie könnten sich die Planungsprioritäten ansehen, aber wenn der Computer nicht mit anderen Aufgaben beschäftigt ist, läuft Ihr Programm immer noch schnell. Es wird also wahrscheinlich nicht ausreichend helfen.Antworten:
nice
(und / oderrenice
). Sie können dies auch programmgesteuert mithilfe einesnice()
Systemaufrufs tun . Dies verlangsamt nicht die Ausführungsgeschwindigkeit an sich, führt jedoch dazu, dass der Linux-Scheduler weniger (und möglicherweise kürzere) Ausführungszeiträume zuweist, häufiger vorbeugt usw. Siehe Prozessplanung (Kapitel 10) unter Grundlegendes zum Linux-Kernel Weitere Informationen zum Scheduling finden .cpufreq-set
Befehl steuern (verlangsamen, beschleunigen) .sched_yield()
, leistungskritische Teile Ihres Programms aufzurufen , wodurch andere Prozesse quantifiziert werden (Codeänderung erforderlich).malloc()
,free()
,clock_gettime()
usw. mit LD_PRELOAD und einige dumme Dinge tun wie mit ein paar Millionen CPU - Zyklen brennenrep; hop;
, einfügen Speicherbarrieren usw. Dadurch wird das Programm sicher verlangsamen. (In dieser Antwort finden Sie ein Beispiel, wie Sie einige dieser Dinge tun können.)-O0
Zusicherungen aktivieren (dh-DDEBUG
).Ich hoffe es hilft.
quelle
-ggdb3
) nicht nicht verlangsamt die Ausführung des Binärcodes nach unten. Es macht es nur größer.QEMU ist ein CPU-Emulator für Linux. Debian hat Pakete dafür (ich kann mir vorstellen, dass die meisten Distributionen dies tun werden). Sie können ein Programm in einem Emulator ausführen, und die meisten von ihnen sollten die Verlangsamung unterstützen. Zum Beispiel hat Miroslav Novak Patches, um QEMU zu verlangsamen.
Alternativ können Sie die Kompilierung auf ein anderes CPU-Linux (arm-none-gnueabi-linux usw.) kreuzen und dann QEMU diesen Code zur Ausführung übersetzen lassen.
Der nette Vorschlag ist einfach und kann funktionieren, wenn Sie ihn mit einem anderen Prozess kombinieren, der CPU verbraucht.
Sie haben nicht gesagt, ob Sie Grafiken, Dateien und / oder Netzwerk-E / A benötigen? Haben Sie etwas über die wissen Klasse von Fehlern die Sie suchen? Handelt es sich um eine Rennbedingung, oder funktioniert der Code bei einem Kunden nur schlecht?
Bearbeiten: Sie können auch Signale wie STOP und CONT verwenden , um Ihr Programm zu starten und zu stoppen. Ein Debugger kann dies auch tun. Das Problem ist, dass der Code mit voller Geschwindigkeit ausgeführt wird und dann gestoppt wird. Die meisten Lösungen mit dem Linux-Scheduler haben dieses Problem.
Es gab eine Art Thread-Analysator von Intel afair. Ich sehe Vtune Release Notes . Dies ist Vtune, aber ich war mir ziemlich sicher, dass es ein anderes Tool gibt, um Thread-Rennen zu analysieren.Siehe: Intel Thread Checker , der nach einigen Thread-Race-Bedingungen suchen kann. Aber wir wissen nicht, ob die App Multithreading ist?quelle
Verwendung
cpulimit
:Es ist in den Ubuntu-Repos. Gerade
Hier einige Beispiele zur Verwendung in einem bereits laufenden Programm:
quelle
quelle
Wenn Sie Ihr Programm nur simulieren möchten, um sein Verhalten auf einem sehr langsamen Computer zu analysieren, können Sie versuchen , Ihr gesamtes Programm als eines
thread
anderer Hauptprogramme auszuführen .Auf diese Weise können Sie denselben Code mit unterschiedlichen Prioritäten in wenigen Threads gleichzeitig priorisieren und Daten Ihrer Analyse erfassen. Ich habe dies in der Spieleentwicklung für die Frame-Processing-Analyse verwendet.
quelle
Verwenden Sie sleep oder warten Sie in Ihrem Code. Dies ist nicht die hellste Methode, aber für alle Arten von Computern mit unterschiedlichen Geschwindigkeiten akzeptabel.
quelle
Der einfachste Weg, dies zu tun, besteht darin, Ihren ausführbaren Hauptcode in eine while-Schleife mit einem Ruhezustand am Ende zu setzen.
Beispielsweise:
Wie bereits erwähnt, ist dies nicht der genaueste Weg, da Ihr Logikcode weiterhin mit normaler Geschwindigkeit ausgeführt wird, jedoch mit Verzögerungen zwischen den Durchläufen. Außerdem wird davon ausgegangen, dass Ihr Logikcode in einer Schleife ausgeführt wird.
Aber es ist sowohl einfach als auch konfigurierbar.
quelle