Lassen Sie ein Programm langsam laufen

Lesezeit: 8 Minuten

Benutzeravatar von RoboAlex
RoboAlex

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.
  • Du möchtest vielleicht Erhöhen Sie die Interrupt-Frequenz des Timers um den Kernel stärker zu belasten, was wiederum alles verlangsamt. Dies erfordert einen Kernel-Rebuild.
  • 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

Benutzeravatar von artless noise
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).

    – osgx

    22. April 2013 um 12:10 Uhr

Benutzeravatar von Izkata
Izkata

Verwenden cpulimit:

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:

cpulimit --exe bigloop --limit 40
cpulimit --exe /usr/local/bin/bigloop --limit 40 

Einen Prozess per PID auf 55 % CPU begrenzen:

cpulimit --pid 2960 --limit 55

  • 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

Mikhails Benutzeravatar
Michail

  1. Holen Sie sich einen alten Computer
  2. 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.

Alpers Benutzeravatar
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.

Kalails Benutzeravatar
Kalail

Der einfachste Weg, dies zu tun, wäre, Ihren ausführbaren Hauptcode in eine While-Schleife mit einem Schlaf am Ende zu verpacken.

Zum Beispiel:

void main()
{
    while 1
    {
        // Logic
        // ...
        usleep(microseconds_to_sleep)
    }
}

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.

1421490cookie-checkLassen Sie ein Programm langsam laufen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy