最小コードCPUストレステスター…


28

前書き

高いCPU負荷を発生させてプロセッサのストレステストを行うことができるユーティリティがたくさんあります。Microsoft Windowsでは、オンボードを使用して、などのcalculator.exe大きな数字を入力し、数回999999999押すとn!CPUが時間外に動作するようになります。

しかし、自分で作成しなかった場合、ソリューションには何が含まれますか?

使命

あなたの使命-あなたがそれを受け入れることを選んだ場合-は、地球上で最小のCPUストレステストツールを作成することです。

マスト…

  1. 中止されるまで100%のCPU負荷を生成する必要があります
  2. ストレステストを実行する秒数を表す数値入力を取得する必要があります
  3. ユーザーがストレステストを中止したり、プログラムを終了したりできるようにする必要があるユーザーインタラクション(キーを押す、ターミナルウィンドウを閉じるなど)を許可する必要があります。
  4. Microsoft Windows、Mac OSx、Linuxをターゲットにする必要があります。
    (ハムスターでもComodore64にストレスをかける可能性があります。したがって、現在のオペレーティングシステムをターゲットにする必要あります。)

してはいけません…

  1. 期待される機能を置き換えるサードパーティのプログラムまたはツールを使用しないでください
    (提案をsystem('cpuStressThing.exe')失格のようなショートカットを提案すると。)

5月…

  1. できる生成する任意のアプローチ/アルゴリズム/機能を使用して、100%のCPU負荷を予想
  2. できる任意のプログラミングまたはスクリプト言語を使用する
    (それを実行してその機能の実用的な検証を可能にする長いほど)

勝利条件

可能な限り最小のソースコードを提示してください。勝者は、上記の「必須」および「必須ではない」条件に準拠する最も小さな(サイズの)ソースコードを提示するものです。さあ、その赤ちゃんを燃やして…


編集

質問はコメントエリアで出されたので…1 CPUコアのみをターゲットにする必要があります。マルチコアソリューションの作成を期待しているわけではありません。結局のところ、これは楽しいはずです-動作しません。


5
「1コアの100%」で十分ですか、それとも「マルチコアCPUの100%」ですか?
トビア14

@Tobiaうん、1コアで十分です。質問を編集して、その情報を具体的に含めました。それがあまりにも明確ではなかったという事実を私に指摘してくれてありがとう。
e寿司14

3
cryptocurrencyの鉱山労働者は/カウントん
TheDoctor

2
@TheDoctor私が説明した条件に合うようにできたら…私のゲストになってください。filesize の36バイトのbashスクリプトを(たとえば)打ち負かすことができる暗号通貨マイナーを見るのは確かに興味深いでしょう。
e寿司14

問題は、ほとんどのマイナーが数千行のコードであるということです。
TheDoctor 14

回答:


28

Bashおよび標準ユーティリティ、36 31 22 29 28 26バイト

yes :|sh&sleep $1;kill $!

2
それはBashコードにはかなり豪華に見えます!それは本当にいい答えです!
イスマエルミゲル14

あなたはを必要と:しませんdo :; done。私はdo;done仕事をしていることがわかった-それは2バイトであなたを引っ張るでしょう。また、bashソリューションのほぼ半分の長さであるため、+ 1を付けました(理由を忘れて、あまりにも複雑にしました$!)。
クリスJ 14

1
@ChrisJ-それは私には機能しません:bash: syntax error near unexpected token `;'。私はこれらのbashのバージョンを試してみた:3.00.15(1)-release (x86_64-redhat-linux-gnu)3.2.48(1)-release (x86_64-apple-darwin12)4.2.25(1)-release (x86_64-pc-linux-gnu)
デジタルトラウマ

1
@ChrisJ-34バイトのksh回答が得られると思います;-)
デジタルトラウマ14

2
「数値入力を行う」スクリプトにするために、そこに置き$1ました10
トビア14

20

Bash / iputils(Linux)、14バイト

ping6 -fw$1 ::

-w deadlineタイマーが期限切れになるまで、IPv6 nullアドレスをフラッディングします。

警告-テストVMでCPUを55〜60%しか消費しません

編集:-私は警告を撤回します。ながらtopレポートping6プロセスのみ55から60パーセントのCPUを消費し、Iは総CPUアイドル率(2コアVM)アプローチゼロを参照します。これはおそらく、パケットを処理する際にカーネルでかなりの処理が行われているためです。

注-ルートとして実行する必要があります。@Tobiaがコメントしているように、これはCPUを独占する何かに対する合理的な要件のようです。そしてOPはコメントでそれを承認しました。


6
+1。私は削除sudo して、テストをルートとして実行する必要があると述べます。CPUを独占するようなものに対する合理的な要件のようです。
トビア14

@トビア-ありがとう-私はあなたが何かに夢中だと思う;-)
デジタルトラウマ14

ping -6 :: -t-> Windows上でこれが私のCPUを暴走させた場合のみ...それはWindows上でLinuxに相当するもので、エラーを与えるだけで、CPUを1%でもロードしません!core2quad 2.63GHzでwindows 8 pro x64を使用しています。
イスマエルミゲル14

@IsmaelMiguel-うん-これをテストするためのウィンドウがありません。だからこそ、タイトルで「Linux」と言ったのです;-)
デジタルトラウマ14

私は、私がやったように、窓で同じことをしようと考えている人たちのために、この答えを役に立たないものとして「与えている」だけです。
イスマエルミゲル14

9

Elf32スタンドアロンバイナリ-86バイト

これは、この機能を実行するために作成できる最小の正しく形成されたElf形式のバイナリだと思います。これは、Linuxベースのプラットフォームで追加サポートなしで実行されるか、オペレーティングシステムがなくても実行されます

バイナリダウンロード:http : //ge.tt/3m6h2cK1/v/0?c

六角ダンプ:

0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000  .ELF............
0000010: 0200 0300 0100 0000 5480 0408 3400 0000  ........T...4...
0000020: 0000 0000 0000 0000 3400 2000 0100 0000  ........4. .....
0000030: 0000 0000 0100 0000 0000 0000 0080 0408  ................
0000040: 0080 0408 5600 0000 5600 0000 0500 0000  ....V...V.......
0000050: 0010 0000 75fe                           ....u.

これは、独自の最小限のElfヘッダーを持つasmファイルを構築し、使用をld完全にスキップすることによって行われます。

アセンブリ:

BITS 32

              org     0x08048000

ehdr:                                                 ; Elf32_Ehdr
              db      0x7F, "ELF", 1, 1, 1, 0         ;   e_ident
times 8       db      0
              dw      2                               ;   e_type
              dw      3                               ;   e_machine
              dd      1                               ;   e_version
              dd      _start                          ;   e_entry
              dd      phdr - $$                       ;   e_phoff
              dd      0                               ;   e_shoff
              dd      0                               ;   e_flags
              dw      ehdrsize                        ;   e_ehsize
              dw      phdrsize                        ;   e_phentsize
              dw      1                               ;   e_phnum
              dw      0                               ;   e_shentsize
              dw      0                               ;   e_shnum
              dw      0                               ;   e_shstrndx

ehdrsize      equ     $ - ehdr

phdr:                                                 ; Elf32_Phdr
              dd      1                               ;   p_type
              dd      0                               ;   p_offset
              dd      $$                              ;   p_vaddr
              dd      $$                              ;   p_paddr
              dd      filesize                        ;   p_filesz
              dd      filesize                        ;   p_memsz
              dd      5                               ;   p_flags
              dd      0x1000                          ;   p_align

phdrsize      equ     $ - phdr

section .text
global  _start
_start:       jnz     _start

filesize      equ     $ - $$

で構築 nasm -f bin tiny_cpu_stresser_elf32.asm -o tiny_cpu_stresser_elf32



6

C、52

t;main(s){for(scanf("%d",&s),t=time();time()-t<s;);}

Ctrl + Cを押して終了します。

ここに画像の説明を入力してください


あなたがPHPでそれを行う場合、あなたは勝ちます!$i=<>部品を取り外して<?最初に追加するだけで、準備完了です!
イスマエルミゲル14

5

Perl、32

for($i=<>,$t=time;time-$t<$i;){}

今、恥ずかしい部分:私は愚か$t=timeに前に立ち、$i=<>それがなぜ数秒早く終了するのかを猛烈に理解しようとしました。

もう一度、Ctrl + Cを押して終了します。

ここに画像の説明を入力してください


5

Unix C、47

main(int a,char**b){alarm(atoi(b[1]));for(;;);}

コマンドラインで時間を渡します。割り込みキー(Ctrl-C)は中止します。


3
あなたはエースの@を使用する場合scanfのトリック、あなたは39にこれを降りることができます:main(a){for(scanf("%d",&a),alarm(a);;);}
デイブ

4

Smalltalk(Smalltalk / X)、34

入力:n; CTRL-cまたはCMD-による割り込み。

[[]loop]valueWithTimeout:n seconds

日単位で測定した場合、より良いゴルフができます;-)(冗談です):

[[]loop]valueWithTimeout:n days

ここに画像の説明を入力してください

またはコマンドラインから: ここに画像の説明を入力してください


4

これは深刻な試みではありませんが、...

バッシュ、12バイト

:(){ :|:&};:

Wikipediaに記載されています。

警告:有害なコード、コンピューターで実行しないでください!


技術的に:
-システムがクラッシュするまで100%のCPU負荷を生成します。
-ユーザーインタラクションでそれを停止できます(すべてのフォークを削除できた場合、実際に停止できます...)。
-実行する秒数を表す数値入力を指定できますが、使用しません。


4

PHP 43 40バイト:

これが受け入れられる答えであることを願っています:

set_time_limit($ _ REQUEST ['t']); while(!0);

<?for(set_time_limit($_REQUEST['t']);;);

このようにすることもできます<?for(set_time_limit($_POST['t']);;);が、柔軟性と3バイトが失われます。


そして、私はカンニングと、次のように行うことができます:<?for(set_time_limit($_REQUEST[t]);;);。2バイト削りますが、これは「標準」ソリューションではありません。ゲームを公正に保ちましょう。


@fireeyedboyと@primoが示唆したように、このソリューション(34バイト)も使用できます。

<?for(set_time_limit($argv[1]);;);

これにより、コンソールから使用できるようになり、次のように呼び出されます。

php <filename> <time in seconds>

私が言ったように、私はコンソールソリューションをターゲットにしていませんが、彼らはこのソリューションの信用を得なければなりません。

もう1つの答えは、この「モンスター」である可能性があります。

<?for(set_time_limit($argv[1]|$_REQUEST['t']);;);

コンソールにいなくても、PHPでキーを押すことはできません。

停止するには、プロセスを中止する必要があります(ページの読み込みを停止すると、コードが停止する場合があります)!

さらに、Androidでも機能します!PHPサーバーをインストールする場合(Google Playで無料)。

動作させるには、次のようにします。

.phpウェブページを作成し?t=<time in seconds>、URLの最後に追加するか、投稿を送信します(フォームまたはajaxを使用して)。


1
@ e-sushi答えを修正し、3バイト削減しました。Bashソリューションほど小さくはありませんが、近いです。そして柔軟に!
イスマエルミゲル14

コマンドラインから実行:で置き換え$_REQUEST['t']$argv[1]から呼び出し:php -f cpustresstest.php <timelimit>で中止し^Cます。
まともなダブラー14

$_GET代わりに使用しないのはなぜ$_REQUESTですか?4バイトで、GETとにかく使用しています
クリストファーサルストルガード14

@KristofferSHansenコードの柔軟性がひどく損なわれるため。
イスマエルミゲル14

@fireeyedboyそれは良いアイデアのように聞こえますが、私が言ったように、私はコンソールをターゲットにしていません。
イスマエルミゲル14

3

BrainFuck / Extended BrainFuck:3

+[]

中止されるまで、1つのコアで100%CPUを使用します。すべてのBrainfuckプログラムは有効なEBFプログラムです。

ゾゾテスLISP:7 15 19

小さなドライバーを使用する場合。

(:'r s) ; redfine read in the read-eval-print-loop

ドライバーなしのスタンドアロン式:15

((:'L(\()(L))))     ; setq a loop function and execute it    

使用法: echo '((\(L)(L))(\()(L)))' | jitbf zozotez.bf


3

Perl-14バイト

alarm<>;{redo}

SIGALRMinput秒単位で送信するように設定し、スクリプトを終了します。それまでは、ビジーウェイトでスピンします。

サンプル使用法:

$ echo 4 | perl stress.pl
Terminating on signal SIGALRM(14)

Perl-12(+1)バイト

コマンドラインオプションがそれぞれ1バイトとしてカウントされる場合、これを使用して13バイトに減らすことができます-n

alarm;{redo}

サンプル使用法:

$ echo 4 | perl -n stress.pl
Terminating on signal SIGALRM(14)

出口要件を簡潔に満たすために信号を巧妙に使用する場合は+1。
機械式カタツムリ14

3

Linux上のx86_64アセンブリ-146(ソース)、42(アセンブルされたコード)

NASM縮小ソース(146バイト):

xor rdi,rdi
mov rcx,[rsp+16]
mov rcx,[rcx]
l:
sub cl,'0'
jl k
imul rdi,10
movsx rdx,cl
add rdi,rdx
ror rcx,8
jmp l
k:
mov rax,37
syscall
s:
jmp s

範囲(0、9999999]で実行する秒数を指定するパラメーターをコマンドラインで受け入れます;通常のCtrl-Cで中断できます。

あなたはそれを組み立てることができます

nasm -f elf64 -o stress.o stress.asm && ld -o stress stress.o

理論的には、追加することが必要となるglobal _startが続くの_start:先頭にラベルが、ld少しの手間で、それ自体でそれを修正するために管理しています。

対応するマシンコード(42バイト):

00000000  48 31 ff 48 8b 4c 24 10  48 8b 09 80 e9 30 7c 11  |H1.H.L$.H....0|.|
00000010  48 6b ff 0a 48 0f be d1  48 01 d7 48 c1 c9 08 eb  |Hk..H...H..H....|
00000020  ea b8 25 00 00 00 0f 05  eb fe                    |..%.......|
0000002a

(をnasm追加して生成BITS 64ディレクティブ)

やや読みやすいバージョン:

global _start

_start:
    xor rdi,rdi
    mov rcx,[rsp+16]
    mov rcx,[rcx]
argparse:
    sub cl,'0'
    jl alarm
    imul rdi,10
    movsx rdx,cl
    add rdi,rdx
    ror rcx,8
    jmp argparse
alarm:
    mov rax,37
    syscall
loop:
    jmp loop

2

Python、58 55 51

うわー、Cよりも長い。もっと良い方法があるはずです。まだ少し長いですが、少なくともCソリューションに勝っています!

import time;t=time.time;u=t()+input()
while t()<u:1

1
ハハ、あなたの最初の文が大好きです。個人的には、Cの答えを標準と考えています。
user12205 14

1
@ace(ベアリー)修正!
ボブ14

2
これで、他のCソリューションがあなたを打ち負かします!
user12205 14

1
@aceああ、あきらめます、少なくともこれは移植可能です!:P(実際には以前にsigalrmを調べましたが、シグナルをセットアップして使用するには高すぎます...ライブラリが必要な場合、Pythonはかなり冗長です:[)
ボブ14

2

Java- 154 148 186

奇妙なエラーが私のThread.sleep()部分を食べました

public class Z{public static void main(String[]a) throws Exception{new Thread(){public void run(){for(;;);}.start();Thread.sleep(Byte.valueOf(a[0])*1000);System.exit(0);}}

より読みやすいバージョン:

public class Z {
    public static void main(String[] a) throws Exception {
        new Thread() {
            public void run() {
                for (;;)
                    ;
            }
        }.start();
        Thread.sleep(Byte.valueOf(a[0]) * 1000);
        System.exit(0);
    }
}

スポーンnew Thread素敵な無限ループ(とfor(;;);その後、メインスレッドA上)thread.sleep()System.exit(0)出口のタイムアウト後。ctrl-cも終了します。cmdlineはそれを短縮することができませんexit()でした。クラッシュすることはありません。


2

バッチ、2文字

%0

本質的に、プログラムは絶えず何度も何度も起動します。プロセッサのタスク割り当ての優先順位により、結果が異なる場合がありますが、私にとってはうまくいきます。


2

Powershell、18 54 50バイト

すべてのCPUコアに対して100%の負荷を生成します。

for($s=date;($s|% AddS* "$args")-ge(date)){sajb{}}
  • スクリプトは引数として秒単位の時間をとります。
  • | AddS*あるショートカットについて.AddSeconds()方法。
  • sajbStart-Jobコマンドレットのエイリアスです。

1
これは要件2(must take a numeric input, representing the number seconds the stress-test should run)をどのように満たしていますか?
18

ありがとう。固定...
mazzy

1

Linux shおよび標準ユーティリティ、14

最近のgnu coreutilsにtimeoutは便利なユーティリティが含まれています。

 timeout $1 yes

1
私にとって100%CPUに近いところはありません。印刷しなければならないため、あまりにも多くの方法が抑制されています...別のコマンドがありますか?
ニックT 14

timeout $1 yes :|sh-おそらく、19を使用して100%の使用率を得ることができます。私の答えのためにこれを盗もうとしましたが、私はスポーツマンのようになります:)
デジタルトラウマ14


1

Go、215 212 193バイト(フル)

package main
import(."runtime"
f"flag"
."strconv"
."time")
func main(){f.Parse()
c:=NumCPU()*2
t,_:=Atoi(f.Arg(0))
GOMAXPROCS(c)
for;c>0;c--{go(func(){for{Now()}})()}
<-After(Duration(t)*1e9)}

ボーナスは、すべてのCPUを強調します。

Now()ループでは、スケジューラでキックにありNow、私は私の名前空間に見つけることができる最短関数名でした

実行するとgo fmt、サイズが286 277 254バイトに増加します



1

アセンブリ:16バイト

_start:jg _start

編集:数値入力を取得する要件に気づいていない、私はそれがコマンドラインでそれを取ると主張するつもりですが、それを無視=)


これには、テストを実行する秒数の数値入力が必要ですか?単純に無限ループするように思えます。それが何であれ、答えに説明を追加することを忘れないでください。
ジャスティン14

ああ...質問のその部分を過ぎて完全に読んでください:/
Riot 14

1

DOSバッチ-5バイト

%0|%0

DOSバッチ-8バイト

%0|%0&%0

2番目は、悪名高いsh forkbombの翻訳です。

Ctrl + Cは、プログラムを中断します(設定を少し調整していない限り)。


1

C#、118

using a=System.DateTime;class b{static void Main(string[]c){var d=a.Now.AddSeconds(int.Parse(c[0]));while(d>a.Now){}}}

非圧縮

using a = System.DateTime;
class b 
{ 
    static void Main(string[] c) 
    {
        var d = a.Now.AddSeconds(int.Parse(c[0]));
        while (d > a.Now) { } 
    } 
}

これには、引数として実行する秒数である数値が必要です。それだけの時間またはcrtl + cまで、1つのコアの100%を使用します。これは、C#が冗長性を伴うのと同じくらい小さいと確信しています。


1

C#-178文字

using A=System.DateTime;class P{static void Main(string[]a){var b=A.Now.AddSeconds(int.Parse(a[0]));System.Threading.Tasks.Parallel.For(0,1<<30,(i,l)=>{if(A.Now>b)l.Stop();});}}

より読みやすく:

using A = System.DateTime;
{ 
    class P 
    {
        static void Main(string[] a)
        { 
            var b = A.Now.AddSeconds(int.Parse(a[0]));
            System.Threading.Tasks.Parallel.For(0, 1 << 30, (i, l) => 
            {
                if (A.Now > b)l.Stop(); 
            });
        }
    }
}

それはC#で178文字で、すべてのコアを使用します。

1 << 30の整数制限のために常に終了する唯一の弱点。


1

Java-88文字

class S{public static void main(String[]a){for(long i=0;i<Long.valueOf(a[0]);){i=i+1;}}}

これにより、2⁶³-1ループが可能になります。

より読みやすいバージョン

class S {
    public static void main(String[] a) {
      for (long i = 0; i < Long.valueOf(a[0]);) { i = i + 1; }
}

C#-87文字

class S{public static void Main(string[]a){for(long i=0;i<long.Parse(a[0]);){i=i+1;}}}

より読みやすいバージョン

class S {
public static void Main(string[] a) {
    for(long i = 0;i < long.Parse(a[0]);i++) { i = i + 1; }
}
}

コアをペギングするプログラム

(これは4コアシステム上にあります)


OPが100%を要求
ミロ14年

OPはまた、1つのコアをペグするだけでよいと指定しました。25%(1コアの100%)に達する可能性があります。
ジャスティンクレイチャ14年

2
うるさくはありませんが、画像は25%ではなく24.89%を示しています
ミロ14年

本当です。それはそのコアで何が起こっているかに依存します。コアで何も起きていない場合、25%をすべて使用します。
ジャスティンクレイチャ14年

1

EcmaScript 6:

z=z=>{while(1)z()};_=i=>(i+=1,i-=1,i++,i--,--i,++i,i<<=2,i>>=2,i+=0|Math.round(1+Math.random())&1|0,z(x=>setInterval(x=>z(x=>new Worker('data:text/javascript,'+_.toSource()),5))));setInterval(x=>z(x=>_(...Array(i=9e3).map((x,z)=>z*3/2*2/4*4e2>>2<<2))),5)

これにより、シングルコアマシンのCPUが100%使用され、Firefoxでは、Firefoxがますます多くのメモリを使用し続けるというボーナスが追加されます。インターフェイス全体がロックされ、それを停止する唯一の方法は、タスクマネージャでFirefoxを強制終了することです。


1

perl、23バイト

ここにリテラルコントロールTを貼り付ける方法がわからないので、代わりに$ ^ Tと入力しましたが、どちらでも機能します(リテラルは23バイトで1文字短くなります)。

$e=$^T+<>;1 until$e<time

$ ^ Tはインタプリタが開始した時間であり、最初に計算するので基本的にtime()として読むことができます。


1

Python、30

私はこの古いパズルがおもしろいと思ったので、古い質問への回答を投稿してもいいと思います。Cの回答がPythonに勝てないようにできませんでした。;)

sum(range(int(input())*2**26))

これは異なるCPUに合わせて調整する必要がありますが、それがOPに違反するとは思わない... 私の 2.8GHz i7コアのsum(range(2**27))1つを約1秒間ペグします。:)


1
PPCGへようこそ!ここでは、古い質問への回答を投稿することは完全に受け入れられますが、私が見る限り、この回答は要件を完全には満たしていませんmust produce 100% CPU load until aborted
ライコニ

ありがとう!:)私のマシンでは、このコードはシングルコアで100%の負荷を生成します。Ctrl-Cを押すか、親プロセスを強制終了(ターミナルウィンドウを閉じるなど)するなどして、他のスクリプトと同様に中止できます。要件2: must take a numeric input, representing the number seconds the stress-test should run。そのため、コードはなんらかの方法でユーザー入力を取得し、それに応じて自己制限し、CPUをペグする必要があります。これは...私はパズルについての最も興味深い見つけ部分です
ジェームズ

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