รหัส CPU น้อยที่สุดทดสอบความเครียด ...


28

บทนำ

มียูทิลิตีมากมายที่สามารถสร้างโหลด CPU สูงเพื่อทดสอบหน่วยประมวลผลของคุณ ใน Microsoft Windows คุณสามารถใช้ออนบอร์ดcalculator.exeป้อนจำนวนมากเช่น999999999นั้นและกดn!หลาย ๆ ครั้งเพื่อให้ซีพียูของคุณทำงานล่วงเวลาได้

แต่มีวิธีแก้ไขอย่างไรถ้าคุณไม่ได้สร้างมันขึ้นมาเอง?

ภารกิจ

ภารกิจของคุณ - ถ้าคุณเลือกที่จะยอมรับ - คือการสร้างเครื่องมือทดสอบความเครียดของ CPU ที่เล็กที่สุดในโลก

ต้อง…

  1. ต้องสร้างโหลด CPU 100% จนกว่าจะถูกยกเลิก
  2. ต้องใช้อินพุตเป็นตัวเลขแสดงถึงจำนวนวินาทีที่การทดสอบความเค้นควรทำงาน
  3. ต้องอนุญาตให้ผู้ใช้โต้ตอบ (กดปุ่มปิดหน้าต่างเทอร์มินัลหรืออะไรทำนองนั้น) ซึ่งจะทำให้ผู้ใช้ยกเลิกการทดสอบความเครียดและ / หรือออกจากโปรแกรม
  4. ต้องกำหนดเป้าหมาย Microsoft Windows, Mac OSx และ / หรือ Linux
    (แม้แต่หนูแฮมสเตอร์ก็สามารถสร้างปัญหา Comodore64 ... คุณต้องกำหนดเป้าหมายระบบปฏิบัติการปัจจุบัน)

ต้องไม่…

  1. ต้องไม่ใช้โปรแกรมหรือเครื่องมือของบุคคลที่สามซึ่งแทนที่การทำงานที่คาดหวัง
    (การเสนอทางลัดในsystem('cpuStressThing.exe')ไลค์ของการตัดสิทธิ์ข้อเสนอของคุณ)

อาจ…

  1. อาจใช้วิธี / อัลกอริทึม / ฟังก์ชันใด ๆ เพื่อสร้างโหลด CPU ที่คาดไว้ 100%
  2. อาจใช้การเขียนโปรแกรมหรือภาษาสคริปต์ใด ๆ
    (ตราบใดที่มันช่วยให้สามารถตรวจสอบการทำงานของมันได้โดยการรัน

สภาพการชนะ

แสดง sourcecode ที่เล็กที่สุดเท่าที่จะเป็นไปได้ ผู้ชนะคือผู้ที่นำเสนอซอร์สโค้ดที่น้อยที่สุด (ขนาด) ที่สุดที่เป็นไปตามเงื่อนไข“ ต้อง” และ“ ต้องไม่” ข้างต้น ตอนนี้ทำให้ทารกนั้นไหม้ ...


แก้ไข

เนื่องจากคำถามเกิดขึ้นในพื้นที่แสดงความคิดเห็น…คุณจะต้องกำหนดเป้าหมาย CPU 1 หลักเท่านั้น ฉันไม่คาดหวังให้คุณผลิตโซลูชั่นแบบมัลติคอร์ หลังจากทั้งหมดนี้ควรสนุก - ไม่ทำงาน


5
"100% ของหนึ่งคอร์" เพียงพอหรือคุณหมายถึง "100% ของซีพียูมัลติคอร์" หรือไม่?
เบีย

@Tobia ใช่แล้ว 1 คอร์ก็เพียงพอแล้ว ฉันได้แก้ไขคำถามเพื่อรวมข้อมูลนั้นโดยเฉพาะ ขอบคุณที่ชี้นำฉันไปสู่ความจริงที่ว่ามันไม่ชัดเจนเกินไป
e-sushi

3
do cryptocurrency miners นับ /
TheDoctor

2
@TheDoctor ถ้าคุณสามารถทำให้มันเหมาะกับเงื่อนไขที่ฉันอธิบาย ... เป็นแขกของฉัน แน่นอนว่ามันน่าสนใจที่จะเห็นคนขุดเจาะ cryptocurrency ที่สามารถเอาชนะสคริปต์ตัวอย่างขนาด 36 ไบต์ในขนาดไฟล์ได้
e-sushi

ปัญหาคือคนงานเหมืองส่วนใหญ่เป็นโค้ดหลายพันบรรทัด
TheDoctor

คำตอบ:


28

Bash และยูทิลิตี้มาตรฐาน, 36 31 22 29 28 26 ไบต์

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

2
ที่ดูสวยสำหรับรหัส Bash! นั่นเป็นคำตอบที่ดีจริงๆ!
Ismael Miguel

คุณไม่จำเป็นต้องใช้ใน: do :; doneฉันพบว่าdo;doneทำงาน - มันจะดึงคุณใน 2 ไบต์ +1 ด้วยสำหรับความยาวของโซลูชั่นทุบตีของฉันเกือบครึ่ง (ฉันทำให้มันซับซ้อนเกินไปโดยไม่มีเหตุผลที่ดีอย่างที่ฉันลืมไป$!)
Chris J

1
@ChrisJ - bash: syntax error near unexpected token `;'ที่ไม่ทำงานสำหรับฉัน: ฉันได้พยายามทุบตีรุ่นเหล่านี้: 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 - ฉันเดาว่าคุณมีkshคำตอบ34 ไบต์ด้วยตัวเอง;-)
Digital Trauma

2
ฉันใส่$1ที่10นั่นเพียงเพื่อทำให้เป็นสคริปต์ที่ "นำเข้าเป็นตัวเลข"
เบีย

20

Bash / iputils (Linux), 14 ไบต์

ping6 -fw$1 ::

Flood-pings ที่อยู่ IPv6 null จนกว่าตัวจับเวลา -w กำหนดเวลาจะหมดอายุ

ข้อแม้ - ใช้ CPU 55-60% ในการทดสอบ VM ของฉันเท่านั้น

แก้ไข: - ฉันเพิกถอนข้อแม้ของฉัน ในขณะที่topรายงานping6กระบวนการใช้ CPU 55-60% เท่านั้นฉันเห็นเปอร์เซ็นต์การไม่ได้ใช้งาน CPU ทั้งหมด (VM 2 คอร์) ที่เป็นศูนย์ สิ่งนี้น่าจะเป็นเพราะการประมวลผลจำนวนมากเกิดขึ้นในเคอร์เนลเนื่องจากมันจัดการกับแพ็คเก็ต

หมายเหตุ - ต้องเรียกใช้ในฐานะรูท ในฐานะที่เป็นความคิดเห็นของ @Tobia ดูเหมือนว่าเป็นข้อกำหนดที่สมเหตุสมผลสำหรับบางสิ่งที่จะทำให้ซีพียูทำงาน และ OP อนุมัติในความคิดเห็น


6
+1 ฉันจะลบsudo และเพียงระบุว่าการทดสอบจะต้องเรียกใช้เป็นราก ดูเหมือนจะเป็นข้อกำหนดที่สมเหตุสมผลสำหรับบางสิ่งที่จะทำให้ซีพียูทำงาน
Tobia

@Tobia - ขอบคุณ - ฉันคิดว่าคุณกำลังเข้าสู่บางสิ่ง ;-)
Digital Trauma

ping -6 :: -t-> เฉพาะเมื่อสิ่งนี้บน windows ทำให้ซีพียูของฉันใช้งานได้ ... มันเป็นลินุกซ์ที่เทียบเท่าบน windows ซึ่งให้ข้อผิดพลาดเท่านั้นและไม่ได้โหลดซีพียูที่ 1%! ฉันใช้ windows 8 pro x64 บน core2quad 2.63GHz
Ismael Miguel

@IsmaelMiguel - อ๋อ - ฉันไม่มีหน้าต่างให้ทดลอง นั่นเป็นเหตุผลที่ฉันระบุ "Linux" ในชื่อ ;-)
Digital Trauma

ฉันรู้ว่าฉันแค่ "แจก" คำตอบนี้ให้เป็นคำตอบที่ไม่ทำงานสำหรับผู้ที่กำลังคิดจะลองทำเหมือนกันในหน้าต่างที่ฉันทำและล้มเหลว
Ismael Miguel

9

Elf32 สแตนด์อโลนไบนารี - 86 ไบต์

ฉันพนันได้ว่านี่เป็นไบนารีรูปแบบเอลฟ์ที่มีขนาดเล็กที่สุดที่ถูกต้องที่สามารถใช้เพื่อทำหน้าที่นี้ได้ ซึ่งจะดำเนินการโดยการสนับสนุนเพิ่มเติมใด ๆ บนแพลตฟอร์มลินุกซ์ใด ๆ ก็ได้หรืออาจแม้ไม่มีระบบปฏิบัติการ

ดาวน์โหลดแบบไบนารี: http://ge.tt/3m6h2cK1/v/0?c

การถ่ายโอนข้อมูล Hex:

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.

สิ่งนี้ทำได้โดยการสร้างไฟล์ asm ที่มีส่วนหัว Elf น้อยที่สุดของมันเองและข้ามการใช้งาน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


7

ทุบตี builtins เพียง 20 ไบต์

ulimit -t $1;exec $0

@ e-sushi ลองด้วยเทอร์มินัลที่เร็วกว่าเช่นคอนโซลข้อความหรือ xterm หรือ rxvt
Geoff Reedy

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
หากคุณใช้scanfกลอุบายของ @ ace คุณสามารถลดได้ถึง 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

นี่ไม่ใช่ความพยายามอย่างจริงจัง แต่ ...

Bash ขนาด 12 ไบต์

:(){ :|:&};:

เท่าที่พบในวิกิพีเดีย

คำเตือน: รหัสที่เป็นอันตรายอย่าเรียกใช้บนคอมพิวเตอร์ของคุณ!


ในทางเทคนิค:
- สร้างโหลด CPU 100% จนกว่าระบบล่ม
- อนุญาตให้ผู้ใช้หยุดการโต้ตอบ (หากคุณจัดการเพื่อฆ่าส้อมทั้งหมดคุณสามารถหยุดได้จริง ... );
- คุณสามารถป้อนตัวเลขที่แสดงถึงจำนวนวินาทีที่ควรเรียกใช้ แต่จะไม่ใช้


4

PHP 43 40 ไบต์:

ฉันหวังว่านี่เป็นคำตอบที่ยอมรับได้:

set_time_limit ($ _ REQUEST [t '']); ในขณะที่ (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 หรือส่งโพสต์ (โดยใช้แบบฟอร์มหรือแม้แต่อาแจ็กซ์)


1
@ e-sushi ฉันแก้ไขคำตอบและลดขนาด 3 ไบต์ ไม่เล็กเท่าโซลูชัน Bash แต่ปิด และด้วยความยืดหยุ่น!
Ismael Miguel

เรียกใช้จากบรรทัดคำสั่ง: แทนที่$_REQUEST['t']ด้วย$argv[1]แล้วเรียกมันว่าด้วย: และยกเลิกด้วยphp -f cpustresstest.php <timelimit> ^C
Dabbler ที่เหมาะสม

ทำไมไม่ใช้$_GETแทน$_REQUEST? 4 ไบต์และคุณกำลังใช้GETอยู่
Kristoffer Sall-Storgaard

@KristofferSHansen เพราะความยืดหยุ่นของรหัสของฉันจะได้รับบาดเจ็บอย่างรุนแรง
Ismael Miguel

@fireeyedboy ฟังดูเหมือนความคิดที่ดี แต่อย่างที่ฉันบอกว่าฉันไม่ได้กำหนดเป้าหมายไปที่คอนโซล
Ismael Miguel

3

BrainFuck / Extended BrainFuck : 3

+[]

มันจะใช้ cpu 100% บนแกนเดียวจนกว่าจะถูกยกเลิก โปรแกรม Brainfuck ทั้งหมดเป็นโปรแกรม EBF ที่ถูกต้อง

Zozotez 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}

ตั้งค่า a SIGALRMที่จะส่งเป็นinputวินาทีซึ่งยุติสคริปต์ ในระหว่างนั้นมันจะหมุนในช่วงรอไม่ว่าง

ตัวอย่างการใช้งาน:

$ 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

ชุดประกอบ x86_64 บน Linux - 146 (แหล่งที่มา), 42 (รหัสประกอบ)

NASM ที่ย่อส่วน (146 bytes):

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!

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

1
ฮ่าฮ่าฉันรักประโยคแรกของคุณ ส่วนตัวฉันถือว่าคำตอบ C เป็นหุ้น
user12205

1
@ace (เพิ่ง) แก้ไข!
บ๊อบ

2
ตอนนี้โซลูชัน C อื่นจะชนะคุณ!
user12205

1
@ace Ah, ฉันยอมแพ้อย่างน้อยก็พกพานี้ : P (ที่จริงผมมองที่ SIGALRM ก่อนหน้านี้ แต่มันเป็นเพียงแพงเกินไปที่จะติดตั้งและใช้สัญญาณ ... งูใหญ่จะค่อนข้างใช้คำฟุ่มเฟือยเมื่อ libs มันจำเป็นต้องใช้: [)
บ๊อบ

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 ไบต์

เพื่อผลิตโหลด 100% สำหรับคอร์ CPU ทั้งหมด

for($s=date;($s|% AddS* "$args")-ge(date)){sajb{}}
  • สคริปต์ใช้เวลาเป็นวินาทีในการโต้แย้ง
  • | AddS*เป็นทางลัดสำหรับ.AddSeconds()วิธีการ
  • sajbเป็นนามแฝงสำหรับStart-Jobcmdlet

1
สิ่งนี้ตอบสนองความต้องการ 2 ( must take a numeric input, representing the number seconds the stress-test should run) อย่างไร?
Οurous

ขอบคุณ แก้ไข ..
mazzy

1

Linux sh และยูทิลิตี้มาตรฐาน, 14

corenils gnu ล่าสุดรวมถึงtimeoutยูทิลิตี้ที่เป็นประโยชน์:

 timeout $1 yes

1
ไม่มีที่ไหนใกล้ 100% CPU สำหรับฉัน; มันเป็นวิธีการควบคุมปริมาณมากเกินไปโดยการพิมพ์ฉันคิดว่า ... มีคำสั่งอื่นหรือไม่
Nick 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)}

โบนัสเน้นทุกซีพียู

Now()ในวงจะมีการเตะในการจัดตารางเวลาที่Nowเป็นชื่อฟังก์ชั่นที่สั้นที่สุดที่ฉันสามารถหาใน namespace ของฉัน

หากฉันรันgo fmtขนาดเพิ่มขึ้นเป็น286 277 254 ไบต์



1

แอสเซมบลี: 16 ไบต์

_start:jg _start

แก้ไข: เมื่อไม่ได้สังเกตเห็นความต้องการที่จะใส่ตัวเลขฉันจะอ้างว่ามันใช้เวลาหนึ่งใน commandline แต่ไม่สนใจมัน =)


การดำเนินการนี้ใช้อินพุตเป็นตัวเลขตามจำนวนวินาทีที่การทดสอบรัน ดูเหมือนว่าฉันจะวนซ้ำไปเรื่อย ๆ อย่าลืมเพิ่มคำอธิบายในคำตอบของคุณ
Justin

อ๋อ ... อ่านส่วนนั้นของคำถามที่ผ่านมาทั้งหมด: /
Riot

1

DOS Batch - 5 ไบต์

%0|%0

DOS Batch - 8 ไบต์

%0|%0&%0

ประการที่สองคือการแปลของ forkbomb sh น่าอับอาย

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) { } 
    } 
}

สิ่งนี้ต้องการตัวเลขเป็นอาร์กิวเมนต์ซึ่งเป็นจำนวนวินาทีในการรัน มันจะใช้ 100% ของหนึ่งคอร์ในช่วงเวลานั้นหรือจนกว่า crtl + c ฉันค่อนข้างแน่ใจว่านี่จะเล็กไปกว่า 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(); 
            });
        }
    }
}

มี 178 chars ใน C # และใช้คอร์ทั้งหมด

จุดอ่อนเดียวที่มันจะลงท้ายด้วยเสมอเพราะมีค่า จำกัด จำนวนเต็ม 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%
Milo

OP ยังระบุด้วยว่าคุณต้องตรึงแกนเดียวเท่านั้น สามารถไปที่ 25% (ซึ่งเป็น 100% ของ 1 คอร์)
Justin Krejcha

2
ไม่ต้องจู้จี้จุกจิก แต่ภาพของคุณแสดง 24.89% ไม่ใช่ 25%
Milo

จริง ขึ้นอยู่กับสิ่งที่เกิดขึ้นบนแกนกลางนั้น ถ้าไม่มีอะไรเกิดขึ้นบนแกนมันก็จะใช้ 25% เต็ม
Justin Krejcha

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 แทน แต่ใช้ได้ทั้งสองอย่าง (ตัวอักษรสั้นลง 1 อักขระที่ 23 ไบต์):

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

$ ^ T เป็นเพียงเวลาที่ล่ามเริ่มต้นดังนั้นคุณสามารถอ่านได้ตามเวลา () เนื่องจากเป็นสิ่งแรกที่เราคำนวณ


1

Python 30

ฉันพบว่าตัวต่อปริศนาเก่านี้น่าสนใจฉันหวังว่าจะเป็นไรที่จะโพสต์คำตอบสำหรับคำถามเก่า ฉันไม่สามารถปล่อยให้คำตอบ C เอาชนะ Python ได้ ;)

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

สิ่งนี้ต้องการการปรับแต่งสำหรับซีพียูที่แตกต่างกัน แต่ฉันไม่คิดว่ามันเป็นการละเมิด OP ... sum(range(2**27))ตรึงหนึ่งในคอร์ 2.8GHz i7 ของฉันเป็นเวลาประมาณหนึ่งวินาที :)


1
ยินดีต้อนรับสู่ PPCG! คำตอบของคำถามที่โพสต์เก่าเป็นที่ยอมรับอย่างสมบูรณ์แบบนี่ must produce 100% CPU load until abortedแต่เท่าที่ผมดูคำตอบนี้ไม่เติมไม่เต็มความต้องการ
Laikoni

ขอบคุณ! :) ในเครื่องของฉันรหัสนี้สร้างโหลดได้ 100% ในแกนเดียวและฉันสามารถยกเลิกได้เหมือนสคริปต์อื่น ๆ โดยกด Ctrl-C หรือฆ่ากระบวนการหลัก (เช่นโดยปิดหน้าต่างเทอร์มินัล) หรืออื่น ๆ หมายเหตุยัง ความต้องการที่ must take a numeric input, representing the number seconds the stress-test should run2: เพื่อให้รหัสจำเป็นต้องป้อนข้อมูลผู้ใช้อย่างใดอย่างหนึ่งและ จำกัด ตัวเองตามเช่นเดียวกับเพียงตรึง CPU นี่คือส่วนที่ฉันคิดว่าน่าสนใจที่สุดเกี่ยวกับตัวต่อปริศนา ...
James

คุณพูดถูกต้องขอบคุณสำหรับความกระจ่าง
Laikoni
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.