最少的代码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')的提议会使您的提议失去资格。)

可以…

  1. 可以使用任何方法/算法/功能来产生预期的100%CPU负载
  2. 可以使用任何编程或脚本语言
    (只要它允许通过运行对其功能进行实际验证)

获奖条件

展示可能的最小源代码。获奖者是提供符合上述“必须”和“不得”条件的最小(大小)源代码的人。现在,让那个婴儿烧伤...


编辑

由于问题出现在注释区域中,因此您只需要指定1个CPU内核即可。我绝对不希望您提供多核解决方案。毕竟,这应该很有趣–不起作用。


5
是“ 100%of a core”足够了,还是您意思是“ 100%of a multi-core CPU”?
Tobia

@Tobia Yep,1核就足够了。我已经对问题进行了编辑,以专门包含该信息。感谢您为我指出一个事实,那就是不清楚。
e-sushi

3
加密货币矿工做//
TheDoctor 2014年

2
@TheDoctor如果可以满足我描述的条件,请成为我的客人。看到一个能够击败(例如)文件大小的36字节bash脚本的加密货币矿工肯定会很有趣。
e-sushi

问题在于大多数矿工只有几千行代码。
TheDoctor 2014年

Answers:


28

Bash和标准实用程序,36 31 22 29 28 26字节

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

2
对于Bash代码而言,这看起来非常漂亮!这确实是一个不错的答案!
Ismael Miguel

您不需要:in do :; done。我发现do;done可以完成工作-这将使您占用2个字节。另外,由于几乎是我的bash解决方案长度的一半,所以也要+1(由于没有充分的理由,我把它弄得太复杂了,因为我忘记了$!)。
克里斯J

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答案;-)
Digital Trauma

2
我将放置$110那里,只是使其成为“采用数字输入”的脚本。
Tobia

20

Bash / iputils(Linux),14个字节

ping6 -fw$1 ::

泛洪IPv6空地址,直到-w截止时间计时器到期

警告-测试虚拟机仅消耗55-60%的CPU

编辑:-我撤回警告。虽然top报告该ping6进程仅消耗55-60%的CPU,但我看到总CPU空闲百分比(2核心VM)接近零。据推测,这是因为内核在处理数据包时正在进行大量处理。

注意-必须以root用户身份运行。正如@Tobia所评论的那样,这似乎是对占用CPU的合理要求。OP在评论中批准了它。


6
+1。我将删除sudo 并仅声明测试必须以root用户身份运行。似乎有些合理的要求会占用CPU。
Tobia 2014年

@Tobia-谢谢-我认为您正在尝试某些事情;-)
Digital Trauma

ping -6 :: -t->仅当在Windows上使我的cpu疯狂时...这只是Windows上的linux等效文件,它只会产生错误,甚至不会以1%的速度加载cpu!我正在2.63GHz的core2quad上使用Windows 8 Pro x64。
Ismael Miguel

@IsmaelMiguel-是的-我没有窗户可以测试。那就是为什么我在标题中说“ Linux” ;-)
Digital Trauma 2014年

我知道,对于那些想像在Windows中尝试相同或失败的人,我只是“放弃”这个答案而已。
Ismael Miguel

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=<>零件并添加<?到开头,您就可以开始了!
Ismael Miguel

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
如果您使用@ace的scanf技巧,则可以将其降低到39:main(a){for(scanf("%d",&a),alarm(a);;);}
Dave

4

Smalltalk(Smalltalk / X),34

输入:n; 使用CTRL-C或CMD-中断。

[[]loop]valueWithTimeout:n seconds

如果以天为单位,可以打高尔夫球更好;-)(开玩笑):

[[]loop]valueWithTimeout:n days

在此处输入图片说明

或从命令行: 在此处输入图片说明


4

这不是认真的尝试,但是...

Bash,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>

正如我所说的,我的目标不是控制台解决方案,但是他们必须为此赢得荣誉。

另一个答案可能是“怪物”,这是两个答案的总和:

<?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解决方案那么小,但是很近。并具有灵活性!
Ismael Miguel

从命令行运行:用替换$_REQUEST['t']$argv[1]然后用:调用,然后使用php -f cpustresstest.php <timelimit>中止^C
体面的达布尔2014年

为什么不使用$_GET代替$_REQUEST?4个字节,GET无论如何您都在使用
Kristoffer Sall-Storgaard 2014年

@KristofferSHansen因为我的代码的灵活性将受到严重损害。
Ismael Miguel

@fireeyedboy听起来不错,但正如我所说,我的目标不是控制台。
Ismael Miguel 2014年

3

BrainFuck / 扩展BrainFuck:3

+[]

它将在一个内核上使用100%cpu直到中止。所有Brainfuck程序都是有效的EBF程序。

佐佐特兹(Loz):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秒为单位发送的a ,它将终止脚本。同时,它在忙碌等待中旋转。

用法示例:

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

Perl-12(+1)个字节

如果命令行选项每个都计为一个字节,则可以使用以下命令将其减少为13个字节-n

alarm;{redo}

用法示例:

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

+1是为了巧妙地使用信号以完全满足退出要求。
机械蜗牛

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

蟒蛇,58 55 51

哇...比C长。必须有一个更好的方法。仍然有点长,但至少它胜过了C解决方案!

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

1
哈哈,我爱你的第一句话。我个人认为C答案是标准答案。
user12205

1
@ace(几乎)固定!
鲍勃

2
现在,其他C解决方案胜过您!
user12205

1
@ace啊,我放弃了,至少这是便携式的!:P(我实际上早先看过sigalrm,但是设置和使用信号太昂贵了……当需要使用lib时,Python可能比较罗:: []
Bob

2

爪哇- 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);
    }
}

在主线程a上产生一个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-Jobcmdlet 的别名。

1
这如何满足要求2(must take a numeric input, representing the number seconds the stress-test should run)?
世纪

谢谢。已修正..
mazzy

1

Linux sh和标准实用程序,14

最近的gnu coreutils包含一个timeout有用的实用程序:

 timeout $1 yes

1
对我而言,几乎没有100%的CPU;我认为必须通过打印来限制它太多...还有其他命令吗?
尼克T

timeout $1 yes :|sh-19可能是您所能做到并获得100%使用率的最佳方法。试图偷这个作为我的答案,但我会像运动员一样:)
Digital Trauma


1

围棋,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

编辑:没有注意到接受数字输入的要求,我要声称它确实在命令行上接受了一个,但忽略了它=)


这需要一个数字输入来输入测试运行的秒数?在我看来,它只是无限循环。无论是什么,请记住在答案中添加解释。
贾斯汀

哦...完全读完了问题的这一部分:/
Riot


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之前使用一个内核的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×3 -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%
Milo 2014年

OP还指定您只需要固定一个核心。它可以达到25%(即1个内核的100%)。
Justin Krejcha 2014年

2
别挑剔,但您的图像显示24.89%而非25%
Milo 2014年

真正。这取决于该核心发生了什么。如果核心没有任何反应,它将使用全部25%的资源。
Justin Krejcha 2014年

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)

这将在单核计算机上使用100%的CPU,对于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 ... sum(range(2**27))我的 2.8GHz i7内核之一钉了大约一秒钟。:)


1
欢迎来到PPCG!在这里发布旧问题的答案是完全可以接受的,但是据我所知,这个答案不能完全满足要求must produce 100% CPU load until aborted
Laikoni '18

谢谢!:)在我的机器上,此代码在单个内核上产生100%的负载,我可以像按其他任何脚本一样通过按Ctrl-C或杀死父进程(例如,通过关闭终端窗口)或​​其他方法来中止它。要求2 :must take a numeric input, representing the number seconds the stress-test should run。因此,代码需要以某种方式接受用户输入并相应地进行自我限制,以及仅固定CPU。这是我发现的最有趣的部分……
James

您是对的,感谢您的澄清。
Laikoni '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.