Мінімальний код стрес-тестера процесора…


28

Вступ

Там багато утиліт, здатних створити високе завантаження процесора, щоб стрес-тестувати ваш процесор (и). У Microsoft Windows ви навіть можете використовувати вбудовану програму calculator.exe, вводити велику кількість подібних даних 999999999і n!кілька разів натискати, щоб ваш процесор (и) працював понаднормово.

Але що в рішенні, якщо ви не створили його самостійно?

Місія

Ваша місія - якщо ви вирішите її прийняти - створити найменший інструмент для стрес-тестування процесора на планеті.

Потрібно…

  1. повинні виробляти 100% завантаження процесора до моменту припинення
  2. повинен приймати числовий вхід, який відображає кількість секунд, які повинен провести стрес-тест
  3. повинен дозволити взаємодію з користувачем (натискання клавіші, закриваюче вікно терміналу чи щось подібне), що повинно дозволяти користувачеві перервати стрес-тест та / або вийти з програми
  4. повинні орієнтуватися на Microsoft Windows, Mac OSx та / або Linux.
    (Навіть хом’як може наголосити на Comodore64 ... тому ви повинні орієнтуватися на поточну операційну систему.)

Не повинен…

  1. не повинні використовувати сторонні програми або засоби, які замінюють очікувану функціональність.
    (Якщо запропонувати ярлики на зразок подобається, system('cpuStressThing.exe')дискваліфікує вашу пропозицію.)

Може…

  1. може використовувати будь-який підхід / алгоритм / функціональність для отримання очікуваного 100% завантаження процесора
  2. може використовувати будь-яку мову програмування або сценаріїв
    (якщо це дозволяє практичну перевірку його функціональності, запустивши його)

Умова виграшу

Представте найменший можливий вихідний код. Виграв той, хто представляє найменший (за розміром) вихідний код, який відповідає вищевказаним умовам "повинен" та "не повинен". А тепер змусьте цю дитину спалити ...


EDIT

Оскільки питання виникло в області коментарів ... вам потрібно націлити лише 1 ядро ​​CPU. Я точно не очікую, що ви виробите багатоядерне рішення. Адже це має бути весело - не працювати.


5
Чи достатньо "100% одного ядра", або ви маєте на увазі "100% багатоядерного процесора"?
Тобія

@Tobia Так, 1 ядро ​​вистачає. Я відредагував своє запитання, щоб спеціально включити цю інформацію. Дякую, що вказали мені на те, що це було не дуже зрозуміло.
e-sushi

3
чи вважають шахтарів криптовалюти /
TheDoctor

2
@TheDoctor Якщо ви зможете зробити це відповідно до описаних нами умов ... будьте моїм гостем. Напевно було б цікаво побачити майнер криптовалюти, який здатний обіграти (наприклад) 36-байтовий скрипт bash у розмірі файлів.
e-sushi

Проблема полягає в тому, що більшість шахтарів - це кілька тисяч рядків коду.
TheDoctor

Відповіді:


28

Bash і стандартні утиліти, 36 31 22 29 28 26 байт

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

2
Це виглядає досить чудово для коду Баша! Це справді приємна відповідь!
Ісмаїл Мігель

Вам не потрібно :ін do :; done. Я знайшов, do;doneчи працює така робота - це потягне вас за 2 байти. Також +1 за те, що це майже половина довжини мого баш-рішення (я зробив це надмірно складним без поважних причин, оскільки я забув про це $!).
Кріс Дж

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)
Digital Trauma

1
@ChrisJ - Я думаю, у вас є відповідь на 34 байти ksh;-)
Digital Trauma

2
Я б поставив $1замість 10цього, просто щоб перетворити його на сценарій, який "бере числове введення".
Тобія

20

Bash / iputils (Linux), 14 байт

ping6 -fw$1 ::

Затоплює нульову адресу IPv6, поки не закінчиться термін -w термін

нюанс - на мою тестову VM витрачається лише 55-60% процесора

Редагувати: - Я відкликаю свій застереження. Хоча у topзвітах ping6процес споживає лише 55-60% процесора, я бачу, що загальний відсоток непрацюючого процесора (2 ядра VM) підходить до нуля. Імовірно, це тому, що велика частина обробки відбувається в ядрі під час обробки пакетів.

Примітка - має бути запущено як root. Як зауважує @Tobia, це здається розумною вимогою до чогось, що зависить процесор. І ОП це схвалив у коментарях.


6
+1. Я б видалив sudo і просто зазначив, що тест повинен бути запущений як root. Це здається розумною вимогою до чогось, що буде завивати процесор.
Тобія

@Tobia - спасибі - я думаю, що ти на щось ;-)
Digital Trauma

ping -6 :: -t-> тільки якщо це на Windows змусило мій процесор розігратися ... Це просто еквівалент linux у Windows, який видає лише помилки і навіть не завантажує процесор на 1%! Я використовую Windows 8 pro x64 на core2quad 2.63GHz.
Ісмаїл Мігель

@IsmaelMiguel - так - у мене немає вікон, щоб перевірити це. Ось чому я назвав "Linux" у назві ;-)
Digital Trauma

Я знаю, я просто "даю" цю відповідь як непрацюючу для тих, хто думає про те, щоб спробувати те саме у Windows, як я і провалив.
Ісмаїл Мігель

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.

Це робиться шляхом створення файлу 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

bash вбудований лише 20 байт

ulimit -t $1;exec $0

@ e-sushi спробуйте скористатися більш швидким терміналом, наприклад, текстовою консоллю або xterm або rxvt
Джефф Реді

6

С, 52

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

Натисніть Ctrl + C, щоб вийти.

введіть тут опис зображення


Якщо ви зробите це в php, ви виграєте! Просто зніміть $i=<>деталь і додайте <?до початку, і ви добре пішли!
Ісмаїл Мігель

5

Перл, 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

Це не є серйозною спробою, але ...

Баш, 12 байт

:(){ :|:&};:

Як виявлено у Вікіпедії .

УВАГА: шкідливий код, не запускайте його на комп’ютері!


Технічно:
- Він виробляє 100% завантаження процесора до збою системи;
- Дозволяє взаємодії з користувачем зупинити його (якщо вам вдасться вбити всі вилки, ви можете фактично зупинити його ...);
- Ви можете дати йому числовий вхід, який відображає кількість секунд, які він повинен запустити, але він не використовуватиме його.


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 байти. Не такий маленький, як рішення Баша, але близький. І з гнучкістю!
Ісмаїл Мігель

Запустіть з командного рядка: замініть, $_REQUEST['t']а $argv[1]потім викликайте його на: php -f cpustresstest.php <timelimit>і перервіть з ^C.
Гідний даблер

Чому б не використовувати $_GETзамість $_REQUEST? 4 байти і ви все GETодно використовуєте
Крістофер Салл-Сторгард,

@KristofferSHansen Тому що гнучкість мого коду сильно зашкодить.
Ісмаїл Мігель

@fireeyedboy Це звучить як гарна ідея, але, як я вже сказав, я не націлююся на консоль.
Ісмаїл Мігель

3

BrainFuck / Extended BrainFuck : 3

+[]

Він буде використовувати 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}

Встановлює SIGALRMнадіслати a за 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 байт):

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!

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

1
Ха-ха, я люблю ваше перше речення. Особисто я вважаю відповідь С як однаковою.
користувач12205

1
@ace (Ледве) виправлено!
Боб

2
Тепер інше рішення C перемагає ваше!
користувач12205

1
@ace Ах, я здаюсь, принаймні цей портативний! : P (я насправді раніше дивився на sigalrm, але налаштовувати та використовувати сигнали просто надто дорого ... Python може бути досить багатомовним, коли потрібні його лібри: [)
Боб

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 байт

Для отримання 100% завантаження для всіх процесорних ядер.

for($s=date;($s|% AddS* "$args")-ge(date)){sajb{}}
  • Сценарій вважає аргументом час у секундах.
  • | AddS*- це ярлик для .AddSeconds()методу.
  • sajbпсевдонім для Start-Jobкомандлета.

1
Як це задовольняє вимогу 2 ( must take a numeric input, representing the number seconds the stress-test should run)?
Οurous

Спасибі. Виправлено ..
маззи

1

Linux sh та стандартні утиліти, 14

Останні gnu coreutils містять timeoutутиліту, яка корисна:

 timeout $1 yes

1
Ніде близько 100% процесора для мене; це занадто сильно заглушене, потрібно думати надруковано ... я думаю, чи є ще одна команда?
Нік Т

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було найкоротшим ім'ям функції, яку я міг знайти у своєму просторі імен

Якщо я запускаю, go fmtрозмір збільшується до 286 277 254 байт



1

Збірка: 16 байт

_start:jg _start

Редагувати: не помітивши вимоги взяти числовий ввід, я стверджую, що він бере один у командному рядку, але ігнорує його =)


Це займає числовий вхід за кількість секунд, які проходить тест? Мені здається, він просто безмежно петлює. Як би там не було, не забудьте додати пояснення у відповідь.
Джастін

Ох ... повністю прочитав минулу частину питання: /
Бунт

1

Пакет DOS - 5 байт

%0|%0

Пакет DOS - 8 байт

%0|%0&%0

По-друге, це переклад сумнозвісного 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) { } 
    } 
}

Для цього потрібне число як аргумент, яке є кількістю секунд для запуску. Він буде використовувати 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 символів в 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-х основній системі)


ОП попросили 100%
Міло

ОП також вказала, що потрібно прив’язати лише одне ядро. Він може йти до 25% (що становить 100% від 1 ядра).
Джастін Крейча

2
Не бути вибагливим, але ваше зображення показує 24,89%, а не 25%
Milo

Правда. Це залежить від того, що відбувається з цим ядром. Якщо в основному нічого не відбувається, воно використовуватиме повних 25%.
Джастін Крейча

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% процесора на одноядерній машині, а в Firefox він має додатковий бонус, який Firefox продовжує використовувати все більше і більше пам’яті; весь інтерфейс блокується, і єдиний спосіб його зупинити - це вбити Firefox в диспетчері завдань.


1

perl, 23 байти

Я не можу зрозуміти, як тут вставити буквальний елемент управління-T, тому я набрав замість нього $ ^ T, але будь-який працює (буквальний на 1 бай коротший на 23 байти):

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

$ ^ T - це саме час запуску інтерпретатора, тому ви в основному можете прочитати це як час (), оскільки це перше, що ми обчислюємо.


1

Пітона, 30

Цю стару головоломку я вважав цікавою, сподіваюсь, що це нормально, щоб опублікувати відповідь на старе запитання. Я просто не міг дати відповіді на C перемогти Python. ;)

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

Це потрібно налаштовувати на різні процесори, але я не думаю, що це порушує ОП ... sum(range(2**27))прив’язує одне з моїх ядер 2,8 ГГц i7 приблизно на секунду. :)


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. Так що код повинен якось приймати введення користувача та відповідно обмежувати його, а також просто прив’язувати процесор. Це частина, яка мені була найцікавішою щодо головоломки ...
Джеймс

Ви маєте рацію, дякую за пояснення.
Лайконі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.