Gibt es eine Möglichkeit, ein C++-Programm langsamer auszuführen, indem Sie Betriebssystemparameter in Linux ändern? Auf diese Weise möchte ich simulieren, was passiert, wenn dieses bestimmte Programm zufällig auf einem wirklich langsameren Computer läuft.
Mit anderen Worten, eine schnellere Maschine sollte sich für dieses bestimmte Programm wie eine langsamere Maschine verhalten.
Sie könnten ‘nice’ verwenden, um ihm eine wirklich niedrige Priorität zu geben – keine endgültige Sache, aber es kann helfen!
– John3136
17. Januar 2013 um 2:29 Uhr
Führen Sie es in einer VM mit einem anderen Programm aus, das den Prozessor dreht.
– Ding
17. Januar 2013 um 2:30 Uhr
nice ist ein Befehl, der die Scheduling-Priorität senkt. Variieren Sie uralt, relativ grob. Sie könnten sich die Planungsprioritäten ansehen, aber wenn die Maschine nicht mit anderen Dingen beschäftigt ist, läuft Ihr Programm trotzdem schnell. Es wird also wahrscheinlich nicht ausreichend helfen.
– Jonathan Leffler
17. Januar 2013 um 2:31 Uhr
Sie müssen bedenken, dass Computer zu jeder Zeit viele laufende Prozesse haben, daher ist es nicht besonders hilfreich, nur Ihre App langsamer laufen zu lassen. Wenn Sie sehen möchten, wie Ihre App auf beschissener Hardware funktioniert, sollten Sie sich diese beschissene Hardware besorgen oder die BIOS-Einstellungen Ihrer Hardware vorübergehend ändern, um sie beschissen zu machen. In einigen BIOS können Sie zusätzliche Kerne deaktivieren und die CPU heruntertakten.
– Mike Trusov
17. Januar 2013 um 2:34 Uhr
Unpress die “Turbo”-Taste!
– SoftDev
22. Januar 2013 um 21:11 Uhr
Verringern Sie die Priorität mit nice (bzw renice). Sie können dies auch programmgesteuert mit tun nice() Systemaufruf. Dies wird die Ausführungsgeschwindigkeit per se nicht verlangsamen, aber den Linux-Scheduler dazu bringen, weniger (und möglicherweise kürzere) Ausführungszeitrahmen zuzuweisen, häufiger vorzubeugen usw. Siehe Prozessplanung (Kapitel 10) zum Verständnis des Linux-Kernels für weitere Details zur Terminplanung.
Sie können verwenden CPU-Frequenzskalierung Mechanismus (erfordert Kernel-Modul) und Steuerung (verlangsamen, beschleunigen) der CPU mit dem cpufreq-set Befehl.
Eine andere Möglichkeit ist anzurufen sched_yield()die anderen Prozessen Quantum in leistungskritischen Teilen Ihres Programms liefert (Codeänderung erforderlich).
Sie können allgemeine Funktionen wie einhaken malloc(), free(), clock_gettime() usw. verwenden LD_PRELOADund machen Sie ein paar dumme Sachen wie das Verbrennen von ein paar Millionen CPU-Zyklen mit rep; hop;, Speicherbarrieren einfügen usw. Dies wird das Programm mit Sicherheit verlangsamen. (Siehe diese Antwort für ein Beispiel, wie man einige dieser Sachen macht).
Wie @Bill erwähnt hat, können Sie Linux immer in einer Virtualisierungssoftware ausführen, mit der Sie die Menge der zugewiesenen CPU-Ressourcen, Speicher usw. begrenzen können.
Wenn Sie wirklich wollen, dass Ihr Programm langsam ist, führen Sie es unter aus Valgrind (kann Ihnen auch helfen, einige Probleme in Ihrer Anwendung wie Speicherlecks, fehlerhafte Speicherreferenzen usw. zu finden).
Eine gewisse Langsamkeit kann erreicht werden, indem Sie Ihre Binärdatei mit deaktivierten Optimierungen neu kompilieren (z -O0 und Behauptungen aktivieren (dh -DDEBUG).
Sie können immer einen alten PC oder ein billiges Netbook (z Ein Laptop pro Kindund vergessen Sie nicht, es einem Kind zu spenden, wenn Sie mit dem Testen fertig sind) mit einer langsamen CPU und führen Sie Ihr Programm aus.
Ich hoffe es hilft.
+1: abwechslungsreiche Reihe von Vorschlägen, einschließlich grundlegender Anforderungen für jeden
– lxop
17. Januar 2013 um 3:14 Uhr
Debugging-Symbole aktivieren (-ggdb3) tut nicht die Ausführung der Binärdatei verlangsamen. Es macht es nur größer.
– Café
17. Januar 2013 um 3:33 Uhr
+1 insb. für “… kaufen Sie einen alten PC oder ein billiges Netbook … und vergessen Sie nicht, es einem Kind zu spenden, wenn Sie mit dem Testen fertig sind”
– Kris
17. Januar 2013 um 9:29 Uhr
Könnten Sie Ihre Antwort bearbeiten, um zu zeigen, wie Sie verschiedene Arten von “langsam” simulieren können? Es gibt einen Unterschied zwischen langsamer I/O, langsamer CPU, langsamem Speicher, Speicherauslastung usw
– parasitje
17. Januar 2013 um 10:53 Uhr
+1 für Vlad. Wahrscheinlich ist cpufreq einfach zu machen, wenn Sie eine CPU und einen Linux-Kernel mit Unterstützung haben. Dies sollte eine Granularität auf Befehlsebene haben. Dies ist wahrscheinlich die beste generische Antwort, ohne neue Hardware zu kaufen. Es simuliert kein langsameres Netzwerk, eine langsamere Festplatte, ein langsameres Video usw., was ebenfalls zu Rennen führen kann.
– ungekünstelter Lärm
17. Januar 2013 um 15:25 Uhr
kunstloser Lärm
QEMU ist ein CPU-Emulator für Linux. Debian hat Pakete dafür (ich denke, die meisten Distributionen Wille). Sie können ein Programm in einem Emulator ausführen, und die meisten von ihnen sollten die Verlangsamung unterstützen. Zum Beispiel, Miroslav Novak hat Patches, um QEMU zu verlangsamen.
Alternativ könnten Sie auf ein anderes CPU-Linux (arm-none-gnueabi-linux usw.) kompilieren und dann QEMU diesen Code zum Ausführen übersetzen lassen.
Das Hübsch Der Vorschlag ist einfach und kann funktionieren, wenn Sie ihn mit einem anderen Prozess kombinieren, der CPU verbraucht.
nice -19 test &
while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;
Sie haben nicht gesagt, ob Sie Grafik-, Datei- und/oder Netzwerk-I/O benötigen? Weißt du etwas über die Klasse des gesuchten Fehlers? Handelt es sich um eine Race-Bedingung, oder funktioniert der Code am Kundenstandort nur schlecht?
Bearbeiten: Sie können auch Signale wie verwenden PAUSE und WEITER um Ihr Programm zu starten und zu stoppen. Ein Debugger kann dies auch tun. Das Problem ist, dass der Code a ausführt Vollgas und wird dann gestoppt. Bei den meisten Lösungen mit dem Linux-Scheduler tritt dieses Problem auf. Es gab eine Art Thread-Analysator von Intel afair. Aha Vtune-Versionshinweise. Das ist Vtune, aber ich war mir ziemlich sicher, dass es ein anderes Tool gibt, um Thread Races zu analysieren. Sehen: Intel-Thread-Checker, die auf einige Thread Race Bedingungen prüfen kann. Aber wir wissen nicht, ob die App Multithreading ist?
und bochs ist ein älterer und langsamerer CPU-Emulator (nur x86).
Cpulimit ist ein Tool, das die CPU-Auslastung eines Prozesses begrenzt (ausgedrückt in Prozent, nicht in CPU-Zeit). Es ist nützlich, Batch-Jobs zu steuern, wenn Sie nicht möchten, dass sie zu viele CPU-Zyklen verbrauchen. Das Ziel besteht darin, zu verhindern, dass ein Prozess länger als ein bestimmtes Zeitverhältnis ausgeführt wird. Es ändert nicht den netten Wert oder andere Scheduling-Prioritätseinstellungen, aber die tatsächliche CPU-Auslastung. Außerdem ist es in der Lage passt sich der Gesamtsystemlast andynamisch und schnell.
Die Kontrolle der verwendeten CPU-Menge erfolgt durch Senden von SIGSTOP- und SIGCONT-POSIX-Signalen an Prozesse.
Alle untergeordneten Prozesse und Threads des angegebenen Prozesses teilen sich den gleichen Prozentsatz der CPU.
Es ist in den Ubuntu-Repos. Gerade
apt-get install cpulimit
Hier sind einige Beispiele für die Verwendung in einem bereits laufenden Programm:
Beschränken Sie den Prozess „bigloop“ nach Namen der ausführbaren Datei auf 40 % CPU:
Ich habe cpulimit noch nicht getestet, aber es scheint die beste Antwort auf ähnliche Fragen auf SE-Sites zu sein. Gibt es einen nennenswerten Unterschied zwischen einem Programm, das mit Beschränkungen von cpulimit ausgeführt wird, und einem Programm, das auf langsamerer Hardware ausgeführt wird? Mein Ziel ist es, eine App zu testen, um sicherzustellen, dass die App auf langsameren Computern ausreichend reagiert (und die Grafik für die langsameren Computer herunterzustimmen).
– trusktr
14. April 2020 um 22:53 Uhr
@trusktr Das hängt stark davon ab, was dieses Programm tatsächlich tut. Bei älterer Hardware kann ich mir spontan vorstellen, dass sich die Festplattengeschwindigkeit und der verfügbare Arbeitsspeicher (RAM) ebenfalls auf die Leistung auswirken, und von Seiten der Grafik auch die GPU. Es können noch mehr sein. Wenn die CPU tatsächlich der Engpass ist, ist cpulimit wahrscheinlich trotzdem einen Versuch wert. (Diese Antwort ist 7 Jahre alt, und damals waren solche Performance-Hits nicht annähernd im Kopf)
– Iskata
15. April 2020 um 16:08 Uhr
Interessant. Du hast recht, an HDD oder GPU habe ich nicht gedacht. Ich nehme an, das Testen mit tatsächlich langsamerer Hardware ist der beste Weg, dies zu tun, aber im Moment habe ich nur eine leistungsstarke Workstation, obwohl ich sogar für Telefone der unteren Preisklasse veröffentlichen möchte (JS + WebGL-App).
– trusktr
15. April 2020 um 19:29 Uhr
Michail
Holen Sie sich einen alten Computer
VPS-Hosting-Pakete laufen in der Regel langsam, haben viele Unterbrechungen und sehr unterschiedliche Latenzen. Je billiger Sie gehen, desto schlechter wird die Hardware sein. Im Gegensatz zu wirklich alter Hardware besteht eine gute Chance, dass sie Befehlssätze (SSE4) enthalten, die normalerweise nicht auf alter Hardware zu finden sind. Wenn Sie jedoch ein System wünschen, das langsam läuft und häufig herunterfährt, ist ein billiger VPS-Host der schnellste Start.
Wenn Sie Ihr Programm nur simulieren möchten, um sein Verhalten auf wirklich langsamen Rechnern zu analysieren, können Sie es versuchen Ihr gesamtes Programm so zu machen, dass es als thread eines anderen Hauptprogramms.
Auf diese Weise können Sie denselben Code mit unterschiedlichen Prioritäten in wenigen Threads gleichzeitig priorisieren und Daten Ihrer Analyse sammeln. Ich habe dies in der Spieleentwicklung für die Frame-Processing-Analyse verwendet.
Alper
Verwenden Sie Sleep oder Wait innerhalb Ihres Codes. Es ist nicht der hellste Weg, aber in allen Arten von Computern mit unterschiedlichen Geschwindigkeiten akzeptabel.
Kalail
Der einfachste Weg, dies zu tun, wäre, Ihren ausführbaren Hauptcode in eine While-Schleife mit einem Schlaf am Ende zu verpacken.
Wie die Leute erwähnen werden, ist dies nicht der genaueste Weg, da Ihr Logikcode immer noch mit normaler Geschwindigkeit läuft, aber mit Verzögerungen zwischen den Läufen. Außerdem wird davon ausgegangen, dass Ihr Logikcode etwas ist, das in einer Schleife ausgeführt wird.
Aber es ist sowohl einfach als auch konfigurierbar.
14214900cookie-checkLassen Sie ein Programm langsam laufenyes
Sie könnten ‘nice’ verwenden, um ihm eine wirklich niedrige Priorität zu geben – keine endgültige Sache, aber es kann helfen!
– John3136
17. Januar 2013 um 2:29 Uhr
Führen Sie es in einer VM mit einem anderen Programm aus, das den Prozessor dreht.
– Ding
17. Januar 2013 um 2:30 Uhr
nice
ist ein Befehl, der die Scheduling-Priorität senkt. Variieren Sie uralt, relativ grob. Sie könnten sich die Planungsprioritäten ansehen, aber wenn die Maschine nicht mit anderen Dingen beschäftigt ist, läuft Ihr Programm trotzdem schnell. Es wird also wahrscheinlich nicht ausreichend helfen.– Jonathan Leffler
17. Januar 2013 um 2:31 Uhr
Sie müssen bedenken, dass Computer zu jeder Zeit viele laufende Prozesse haben, daher ist es nicht besonders hilfreich, nur Ihre App langsamer laufen zu lassen. Wenn Sie sehen möchten, wie Ihre App auf beschissener Hardware funktioniert, sollten Sie sich diese beschissene Hardware besorgen oder die BIOS-Einstellungen Ihrer Hardware vorübergehend ändern, um sie beschissen zu machen. In einigen BIOS können Sie zusätzliche Kerne deaktivieren und die CPU heruntertakten.
– Mike Trusov
17. Januar 2013 um 2:34 Uhr
Unpress die “Turbo”-Taste!
– SoftDev
22. Januar 2013 um 21:11 Uhr