プログラムをゆっくり実行する


102

LinuxのOSパラメータを変更してC ++プログラムをより遅く実行する方法はありますか?このようにして、特定のプログラムが実際に遅いマシンで実行された場合にどうなるかをシミュレーションしたいと思います。

言い換えれば、より高速のマシンは、その特定のプログラムに対してより低速のマシンとして動作する必要があります。


5
「nice」を使用して、優先度を非常に低くすることができます-決定的なものではありませんが、役立つ場合があります。
John3136 2013年

7
プロセッサを回転させる別のプログラムでvm内で実行します。
2013年

12
niceスケジューリングの優先順位を下げるコマンドです。古代を変化させる、比較的原油。スケジューリングの優先順位を確認することもできますが、マシンが他のことをするのに忙しくない場合でも、プログラムは高速で実行されます。だから、それはおそらく十分に助けにはなりません。
ジョナサンレフラー2013年

9
コンピューターは常に多くの実行中のプロセスを持っていることを覚えておく必要があります。そのため、アプリの実行を遅くするだけでは特に役に立ちません。安っぽいハードウェアでアプリがどのように動作するかを確認したい場合は、その安っぽいハードウェアを入手するか、ハードウェアのBIOS設定を一時的に変更して安っぽいハードウェアにする必要があります。一部のBIOSでは、追加のコアを無効にしてCPUのクロックを下げることができます。
マイクトルソフ2013年

23
「ターボ」ボタンを押してください!
SoftDev 2013年

回答:


145
  • nice(および/またはrenice)を使用して優先度を下げます。nice()システムコールを使用してプログラムで行うこともできます。これは、それ自体の実行速度を遅くしませんが、Linuxのスケジューラは少なく割り当てる(そしておそらく短い)になります実行時間枠、より頻繁に先取りする、などを参照のLinuxカーネルを理解するプロセスのスケジューリング(第10章)のスケジュールの詳細については、 。
  • カーネルへの負荷を増やすためにタイマー割り込みの頻度増やして、すべてを遅くすることができます。これにはカーネルの再構築が必要です。
  • あなたは使用することができ、CPUの周波数スケーリングメカニズム(カーネルモジュールが必要)とコントロール(スローダウン、スピードアップ)を使用して、CPU cpufreq-setのコマンドを。
  • もう1つの可能性はsched_yield()、プログラムのパフォーマンスが重要な部分(コードの変更が必要)で、他のプロセスにクォンタムを生成するを呼び出すことです。
  • 次のような一般的な関数をフックできます malloc()free()clock_gettime()使用などLD_PRELOADを、として数百万のCPUサイクルを燃やすようないくつかの愚かなものを行うrep; hop;。これは確かにプログラムを遅くするなど、挿入メモリバリア。(このようなことを行う方法の例については、この回答を参照してください)。
  • @Billが述べたように、割り当てられたCPUリソースやメモリなどの量を制限できる仮想化ソフトウェアでLinuxをいつでも実行できます。
  • 本当にプログラムを遅くしたい場合は、Valgrindで実行してください(メモリリーク、不良メモリ参照など、アプリケーションの問題を見つけるのに役立つ場合もあります)。
  • 最適化を無効にして(つまり-O0、アサーションを有効にして(つまり-DDEBUG))バイナリを再コンパイルすることで、ある程度の速度低下を達成できます。
  • CPUが遅い古いPCまたは安価なネットブック(One Laptop Per Childなど)をいつでも購入して、プログラムを実行することができます。

それが役に立てば幸い。


15
+1:それぞれの基本要件を含む、さまざまな提案セット
lxop '17年

4
デバッグシンボル(-ggdb3)を有効にしても、バイナリの実行速度低下しませ。大きくするだけです。
caf

11
+1、特に「...古いPCまたは安価なネットブックを購入...そしてテストが終わったら、子供に寄付することを忘れないでください」
クリスヤン

3
回答を編集して、さまざまなタイプの「遅い」をシミュレートする方法を示してください。遅いI / O、遅いCPU、遅いメモリ、メモリのスラッシングなどには違いがあります
parasietje

3
Vladの+1。サポートされているCPUとLinuxカーネルがあれば、おそらくcpufreqは簡単に実行できます。これには、命令レベルの細分性が必要です。これはおそらく、新しいハードウェアを購入せずに最も一般的な答えです。レースを引き起こす可能性のある低速のネットワーク、ディスク、ビデオなどをシミュレートしません。
アートレスノイズ2013

36

QEMU はLinux用のCPUエミュレーターです。Debianにはパッケージがあります(ほとんどのディストリビューションがそうなると思います)。エミュレータでプログラムを実行でき、それらのほとんどは速度の低下をサポートするはずです。たとえば、 Miroslav NovakはQEMUを遅くするパッチがあります。

または、別のCPU-linux(arm-none-gnueabi-linuxなど)にクロスコンパイルし、QEMUでそのコードを変換して実行することもできます。

素敵な提案は簡単で、あなたはCPUを消費します別のプロセスとそれを組み合わせる場合は動作する可能性があります。

nice -19 test &
while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;

グラフィックス、ファイル、ネットワークI / Oが必要かどうかは言いませんでしたか?クラスについて何か知っていますかあなたが探しているエラーていますか?それは競合状態ですか、それとも顧客サイトでのコードのパフォーマンスが悪いのですか?

編集:STOPCONT などの信号を使用してプログラムを開始および停止することもできます。デバッガもこれを行うことができます。問題は、コードがフルスピードで実行されてから停止することです。Linuxスケジューラのほとんどのソリューションでこの問題が発生します。 Intel afairのスレッドアナライザーがありました。私が見るインテル®VTuneリリースノート。これはVtuneですが、スレッドの競合を分析するための別のツールがあると確信していました。 参照:一部のスレッドの競合状態をチェックできるIntel Thread Checker。しかし、アプリがマルチスレッドかどうかはわかりませんか?


1
そしてbochsは古くて遅いCPUエミュレーターです(x86のみ)。
osgx 2013

22

使用cpulimit

Cpulimitは、プロセスのCPU使用率を(CPU時間ではなくパーセンテージで)制限するツールです。CPUサイクルを使いすぎないようにする場合は、バッチジョブを制御すると便利です。目標は、指定された時間比率を超えてプロセスが実行されるのを防ぐことです。nice値やその他のスケジューリング優先順位の設定は変更されませんが、実際のCPU使用率は変更されます。また、システム全体の負荷に動的かつ迅速に適応することができます。

使用されるCPU量の制御は、SIGSTOPおよびSIGCONT POSIXシグナルをプロセスに送信して行われます。

指定したプロセスのすべての子プロセスとスレッドは、CPUの同じ割合を共有します。

Ubuntuリポジトリにあります。ただ

apt-get install cpulimit

既に実行中のプログラムでの使用方法の例をいくつか示します。

プロセス「bigloop」を実行可能ファイル名で40%CPUに制限します。

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

PIDでプロセスを55%CPUに制限します。

cpulimit --pid 2960 --limit 55

私はまだcpulimitをテストしていませんが、SEサイトの同様の質問に対する最良の回答のようです。cpulimitによる制限付きで実行されているプログラムと、より低速なハードウェアで実行されているプログラムとの間に、顕著な違いはありますか?私の目標は、アプリをテストして、遅いマシンでもアプリが十分に応答することを確認することです(遅いマシンのグラフィックを調整すること)。
trusktr

@trusktrそれはそのプログラムが実際に何をしているかに大きく依存します。古いハードウェアでは、ディスク速度と使用可能なメモリ(RAM)もパフォーマンスに影響を与えると思いますが、グラフィックス、GPUについても同様です。もっとあるかもしれません。CPUが実際にボトルネックである場合、cpulimitはおそらく試す価値があります。(この答えは7年前のもので、当時はそのようなパフォーマンスのヒットは頭のどこにもありませんでした)
Izkata

面白い。あなたは正しい、私はHDDやGPUを考慮していませんでした。実際の遅いハードウェアでテストするのが最善の方法だと思いますが、ローエンドの電話(JS + WebGLアプリ)でも公開したいのですが、現時点では強力なワークステーションしかありません。
trusktr

13
  1. 古いコンピューターを入手する
  2. VPSホスティングパッケージは、実行速度が遅く、中断が多く、レイテンシが大きく変動する傾向があります。安くすればするほどハードウェアは悪化します。本当に古いハードウェアとは異なり、通常は古いハードウェアにはない命令セット(SSE4)が含まれる可能性が高くなります。それでも、ゆっくり歩いて頻繁にシャッターを切るシステムが必要な場合は、安価なVPSホストが最も早いスタートです。

3

非常に遅いマシンでプログラムの動作を分析するためにプログラムをシミュレートしたいだけの場合は、プログラム全体を他のいくつかのメインプログラムとして実行させることができます。thread

このようにして、いくつかのスレッドで異なるコードを使用して同じコードに一度に優先順位を付け、分析のデータを収集できます。これをゲーム開発でフレーム処理分析に使用しました。


2

コード内でスリープまたは待機を使用します。これは最も明るい方法ではありませんが、さまざまな速度のあらゆる種類のコンピュータで受け入れられます。


2

これを行う最も簡単な方法は、メインの実行可能コードをwhileループでラップし、最後にスリープを設定することです。

例えば:

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

人々が言及するように、ロジックコードは通常の速度で実行されますが、実行の間に遅延があるため、これは最も正確な方法ではありません。また、ロジックコードはループで実行されるものであると想定しています。

しかし、それはシンプルで構成可能です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.