Стресс-тестер процессора с минимальным кодом…


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. может использовать любой язык программирования или сценариев
    (при условии, что он позволяет на практике проверить его функциональность, запустив его)

Условие победы

Представьте наименьший возможный исходный код. Победителем становится тот, кто представит самый минимальный (по размеру) исходный код, соответствующий указанным выше условиям «должен» и «не должен». Теперь, чтобы этот ребенок сгорел ...


РЕДАКТИРОВАТЬ

Так как вопрос возник в области комментариев ... вам нужно только нацелиться на 1 ядро ​​процессора. Я определенно не ожидаю, что вы создадите многоядерное решение. В конце концов, это должно быть весело, а не работать.


5
Достаточно ли «100% одного ядра», или вы имеете в виду «100% многоядерного процессора»?
Tobia

@ Tobia Да, 1 ядра достаточно. Я отредактировал свой вопрос, чтобы специально включить эту информацию. Спасибо, что указали мне на тот факт, что это было не слишком ясно.
e-суши

3
ли майнеры криптовалюты считать /
TheDoctor

2
@TheDoctor Если вы можете сделать это в соответствии с условиями, которые я описал ... быть моим гостем. Конечно, было бы интересно увидеть криптовалютный майнер, способный побить (например) 36-байтовый bash-скрипт в размере файла.
e-суши

Проблема в том, что большинство майнеров имеют несколько тысяч строк кода.
TheDoctor

Ответы:


28

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

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

2
Это выглядит великолепно для кода Bash! Это действительно хороший ответ!
Исмаэль Мигель

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

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там, чтобы превратить в сценарий, который «принимает числовой ввод».
Tobia

20

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

ping6 -fw$1 ::

Захватывает нулевой адрес IPv6 до истечения таймера крайнего срока -w

предостережение - только 55-60% процессора потребляет на моей тестовой ВМ

Изменить: - Я убираю свою оговорку. Хотя topотчеты ping6показывают, что процесс потребляет только 55-60% ЦП, я вижу, что общий процент простоя ЦП (2 ядра ВМ) приближается к нулю. Вероятно, это связано с тем, что во время обработки пакетов в ядре происходит большая часть обработки.

Примечание - должен быть запущен от имени пользователя root. Как комментирует @Tobia, это кажется разумным требованием для чего-то, что нагружает процессор. И ФП одобрил это в комментариях.


6
+1. Я хотел бы удалить sudo и просто заявить, что тест должен быть запущен от имени пользователя root. Это кажется разумным требованием для чего-то, что нагружает процессор.
Tobia

@Tobia - спасибо - я думаю, что вы на что-то ;-)
Цифровая травма

ping -6 :: -t-> только если это в Windows заставило мой процессор нервничать ... Это просто эквивалент Linux на Windows, который только выдает ошибки и даже не загружает процессор на 1%! Я использую Windows 8 Pro x64 на Core2quad 2,63 ГГц.
Исмаэль Мигель

@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

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

:(){ :|:&};:

Как найдено в Википедии .

ВНИМАНИЕ: вредный код, не запускайте его на своем компьютере!


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


4

PHP 43 40 байт:

Я надеюсь, что это приемлемый ответ:

set_time_limit ($ _ REQUEST [ 'т']), в то время (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, но близко. И с гибкостью!
Исмаэль Мигель

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

Почему бы не использовать $_GETвместо $_REQUEST? 4 байта, и вы все GETравно используете
Кристоффер Салл-Сторгард

@KristofferSHansen Потому что гибкость моего кода сильно пострадает.
Исмаэль Мигель

@fireeyedboy Это звучит как хорошая идея, но, как я уже сказал, я не нацеливаюсь на консоль.
Исмаэль Мигель

3

BrainFuck / Расширенный 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отправку в 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

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 Ах, я сдаюсь, По крайней мере, этот портативный! : 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()и a 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

Матлаб - 19

tic;while toc<5;end

Замените 5на желаемое время выполнения.


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

Бонус, подчеркивает все процессоры.

Цикл Now()in, который нужно включить в планировщике, Nowбыл самым коротким именем функции, которое я мог найти в своем пространстве имен

Если я бегу go fmt размер увеличивается до 286 277 254 байт



1

Сборка: 16 байт

_start:jg _start

Изменить: не заметив требования для ввода числового ввода, я собираюсь утверждать, что он принимает один в командной строке, но игнорирует его =)


Это занимает числовой ввод для количества секунд, которые запускает тест? Мне кажется, что это просто бесконечно. Что бы это ни было, не забудьте добавить объяснение в свой ответ.
Джастин

Ох ... полностью прочитайте эту часть вопроса: /
Бунт

1

DOS Batch - 5 байт

%0|%0

DOS Batch - 8 байт

%0|%0&%0

Во-вторых, это перевод печально известной ш-вилки.

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%
Мило

Правда. Это зависит от того, что происходит на этом ядре. Если с ядром ничего не происходит, он будет использовать все 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 - это просто время запуска интерпретатора, поэтому вы можете в основном прочитать его как time (), так как это первое, что мы вычисляем.


1

Python, 30

Я нашел эту старую головоломку интересной, я надеюсь, что все в порядке, чтобы опубликовать ответ на старый вопрос. Я просто не мог позволить C-ответам победить Python. ;)

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

Это нужно настроить для разных процессоров, но я не думаю, что это нарушает OP ... 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.