Wprowadzenie
Istnieje wiele narzędzi, które mogą generować duże obciążenie procesora w celu przetestowania procesora (ów). W systemie Microsoft Windows można nawet używać urządzenia pokładowego calculator.exe
, wprowadzać dużą liczbę, np. 999999999
I naciskać n!
kilka razy, aby procesory działały w nadgodzinach.
Ale co jest w rozwiązaniu, jeśli sam go nie stworzyłeś?
Misja
Twoim zadaniem - jeśli zdecydujesz się to zaakceptować - jest stworzenie najmniejszego narzędzia do testowania obciążenia procesora na świecie.
Musi…
- musi generować 100% obciążenia procesora aż do przerwania
- musi przyjmować dane liczbowe reprezentujące liczbę sekund, które powinien wykonać test warunków skrajnych
- musi umożliwiać interakcję użytkownika (naciśnięcie klawisza, zamknięcie okna terminala itp.), co powinno umożliwić użytkownikowi przerwanie testu warunków skrajnych i / lub wyjście z programu
- musi być ukierunkowany na Microsoft Windows, Mac OSx i / lub Linux.
(Nawet chomik może zestresować Comodore64 ... dlatego musisz celować w bieżący system operacyjny.)
Nie wolno…
- nie wolno używać programów ani narzędzi innych firm, które zastępują oczekiwaną funkcjonalność.
(Proponowanie skrótów takich jaksystem('cpuStressThing.exe')
dyskwalifikuje twoją propozycję).
Może…
- może wykorzystywać dowolne podejście / algorytm / funkcjonalność w celu uzyskania oczekiwanego 100% obciążenia procesora
- może korzystać z dowolnego języka programowania lub skryptów
(o ile pozwala to na praktyczną weryfikację jego funkcjonalności przez uruchomienie)
Warunki wygranej
Przedstaw najmniejszy możliwy kod źródłowy. Zwycięzcą jest ten, który prezentuje najbardziej minimalny (pod względem wielkości) kod źródłowy, który spełnia powyższe warunki „musi” i „nie może”. Teraz spraw, aby to dziecko paliło…
EDYTOWAĆ
Ponieważ pytanie pojawiło się w polu komentarza ... musisz tylko celować w 1 rdzeń procesora. Na pewno nie oczekuję, że stworzysz rozwiązanie wielordzeniowe. W końcu powinna to być zabawa - nie praca.
Odpowiedzi:
Bash i standardowe narzędzia,
363122292826 bajtówźródło
:
indo :; done
. Znalazłemdo;done
pracę - to wciągnie cię na 2 bajty. Również +1 za bycie prawie połową długości mojego rozwiązania bashowego (zrobiłem to zbyt skomplikowane bez żadnego powodu, ponieważ o tym zapomniałem$!
).bash: syntax error near unexpected token `;'
. Próbowałem te wersje 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)
ksh
odpowiedź ;-)$1
w miejscu10
tam, po prostu zrobić to do skryptu, który „ma wejście numeryczne”.Bash / iputils (Linux), 14 bajtów
Flood-ping pinguje adres zerowy IPv6, aż do upływu czasu -w timera
zastrzeżenie - zużywa tylko 55-60% procesora na mojej testowej maszynie wirtualnejEdycja: - Cofam swoje zastrzeżenie. Chociaż
top
raporty o tymping6
, że proces zużywa tylko 55–60% procesora, widzę, że całkowity procent bezczynności procesora (2 rdzenie VM) zbliża się do zera. Przypuszczalnie dzieje się tak, ponieważ w jądrze podczas przetwarzania pakietów odbywa się spora część przetwarzania.Uwaga - należy uruchomić jako root. Jak komentuje @Tobia, wydaje się to rozsądnym wymogiem dla czegoś, co spowoduje zawieszenie procesora. I PO zatwierdziło to w komentarzach.
źródło
sudo
i po prostu stwierdzić, że test musi być uruchomiony jako root. Wydaje się, że jest to uzasadnione wymaganie dotyczące czegoś, co spowoduje zawieszenie procesora.ping -6 :: -t
-> tylko jeśli to w systemie Windows spowodowało, że mój procesor oszalał ... To tylko odpowiednik linuksa w systemie Windows, który daje tylko błędy i nawet nie ładuje procesora na poziomie 1%! Używam Windows 8 pro x64 na core2quad 2.63GHz.Samodzielny plik binarny Elf32 - 86 bajtów
Założę się, że jest to najmniejszy poprawnie sformatowany plik binarny w formacie Elf, który można wykonać w celu wykonania tej funkcji. Uruchomi się to bez dodatkowej pomocy na platformie opartej na systemie Linux lub potencjalnie nawet bez systemu operacyjnego .
Pobieranie binarne: http://ge.tt/3m6h2cK1/v/0?c
Zrzut szesnastkowy:
Odbywa się to poprzez zbudowanie pliku asm z minimalnym własnym nagłówkiem Elf i pominięcie korzystania z niego
ld
całkowicie.Montaż:
Zbudowany z
nasm -f bin tiny_cpu_stresser_elf32.asm -o tiny_cpu_stresser_elf32
źródło
bash wbudował tylko 20 bajtów
źródło
C, 52
Naciśnij Ctrl + C, aby wyjść.
źródło
$i=<>
część i dodaj<?
do początku i możesz zacząć!Perl, 32
Teraz zawstydzająca część: głupio stawiam
$t=time
przed sobą$i=<>
i wściekle próbuję dowiedzieć się, dlaczego wychodzi kilka sekund wcześniej.Ponownie, Ctrl + C, aby wyjść.
źródło
Unix C, 47
Spędź czas w wierszu poleceń. Klawisz Przerwania (Ctrl-C) zostaje przerwany.
źródło
scanf
sztuczki @ ace , możesz sprowadzić ją do 39:main(a){for(scanf("%d",&a),alarm(a);;);}
Smalltalk (Smalltalk / X), 34
wejście: n; przerwać za pomocą CTRL-c lub CMD-.
lepiej grać w golfa, jeśli mierzy się go w dniach ;-) (tylko żartuję):
lub z linii poleceń:
źródło
To nie jest poważna próba, ale ...
Bash, 12 bajtów
Jak znaleziono na Wikipedii .
UWAGA: szkodliwy kod, nie uruchamiaj go na swoim komputerze!
Technicznie:
- Wytwarza 100% obciążenia procesora, aż do awarii systemu;
- Umożliwia interakcję użytkownika, aby go zatrzymać (jeśli uda ci się zabić wszystkie widelce, możesz faktycznie to zatrzymać ...);
- Możesz podać dane liczbowe, które reprezentują liczbę sekund, które powinien uruchomić, ale nie będą go używać.
źródło
PHP
4340 bajtów:Mam nadzieję, że to akceptowalna odpowiedź:
set_time_limit ($ _ REQUEST ['t']); while (! 0);Mógłbym zrobić tak:
<?for(set_time_limit($_POST['t']);;);
ale straciłoby to elastyczność i 3 bajty.I mogę oszukać i zrobić tak:
<?for(set_time_limit($_REQUEST[t]);;);
. Ogolił 2 bajty, ale nie jest to „standardowe” rozwiązanie. Pozwala zachować uczciwość gry.Jak sugerują @fireeyedboy i @primo, możesz również użyć tego rozwiązania (34 bajty):
Dzięki temu można go używać z konsoli, nazywając go w następujący sposób:
Jak powiedziałem, nie celuję w rozwiązanie konsolowe, ale oni muszą zdobyć kredyt na to.
Inną odpowiedzią może być ten „potwór”, który jest połączeniem obu odpowiedzi:
Nie można uzyskać naciśnięć klawiszy w php, nie będąc na konsoli, na którą nie celuję!
Aby go zatrzymać, MUSISZ przerwać proces (zatrzymanie ładowania strony może zatrzymać kod)!
Na plus działa również w Androidzie! Jeśli zainstalujesz serwer php (bezpłatny w Google Play).
Aby to działało, po prostu wykonaj następujące czynności:
Tworzysz stronę .php i dołączasz
?t=<time in seconds>
na końcu adresu URL lub wysyłasz post (używając formularza, a nawet ajax).źródło
$_REQUEST['t']
a$argv[1]
następnie wywołaj za pomocą:php -f cpustresstest.php <timelimit>
i przerwij za pomocą^C
.$_GET
zamiast$_REQUEST
? 4 bajty, aGET
mimo to używaszBrainFuck / Extended BrainFuck : 3
Użyje 100% procesora na jednym rdzeniu, aż do przerwania. Wszystkie programy Brainfuck są prawidłowymi programami EBF.
Zozotez LISP : 7
1519Podczas korzystania z małego sterownika.
Jako samodzielne wyrażenie bez sterownika: 15
Stosowanie:
echo '((\(L)(L))(\()(L)))' | jitbf zozotez.bf
źródło
Perl - 14 bajtów
Ustawia
SIGALRM
wysyłanie winput
ciągu kilku sekund, co kończy skrypt. W międzyczasie kręci się w oczekiwaniu na zajęcie.Przykładowe użycie:
Perl - 12 (+1) bajtów
Jeśli opcje wiersza poleceń są liczone jako jeden bajt, można to zmniejszyć do 13 bajtów, używając
-n
:Przykładowe użycie:
źródło
Montaż x86_64 w systemie Linux - 146 (źródło), 42 (złożony kod)
Zminimalizowane źródło NASM (146 bajtów):
Akceptuje parametr w wierszu poleceń określający liczbę sekund do uruchomienia w zakresie (0, 9999999]; można go przerwać zwykłym Ctrl-C.
Możesz go złożyć za pomocą
Teoretycznie na początku konieczne byłoby dodanie etykiety,
global _start
po której następuje_start:
etykieta, aleld
udało się to naprawić samemu bez większego zamieszania.Odpowiedni kod maszynowy (42 bajty):
(wygenerowany po
nasm
dodaniuBITS 64
dyrektywy)Nieco bardziej czytelna wersja:
źródło
Python,
585551Wow ... dłużej niż C. Musi być lepszy sposób.Jeszcze trochę, ale przynajmniej bije rozwiązanie C!źródło
Java -
154 148186Dziwny błąd zjadł moją
Thread.sleep()
częśći bardziej czytelna wersja:
Odradza się
new Thread
z ładną nieskończoną pętlą (for(;;);
), a następnie w głównym wątkuthread.sleep()
aiSystem.exit(0)
po upływie limitu czasu, aby wyjść; ctrl-c wychodzi, również na cmdline nie był w stanie tego skrócićexit()
. zawieszanie się nie zadziała;źródło
Partia, 2 znaki
%0
W gruncie rzeczy program ciągle zaczyna się od nowa. Twoje wyniki mogą się różnić ze względu na priorytet przydzielania zadań procesorowi, ale działa dla mnie.
źródło
PowerShell,
185450 bajtówAby wytworzyć 100% obciążenia dla wszystkich rdzeni procesora.
| AddS*
jest skrótem do.AddSeconds()
metody.sajb
jest aliasem poleceniaStart-Job
cmdlet.źródło
must take a numeric input, representing the number seconds the stress-test should run
)?Linux sh i standardowe narzędzia, 14
Najnowsze gnu coreutils zawiera
timeout
narzędzie, które jest pomocne:źródło
timeout $1 yes :|sh
- 19 to prawdopodobnie najlepsze, co możesz zrobić i uzyskać 100% wykorzystania. Kusiło mnie, by ukraść to za moją odpowiedź, ale będę sportowcem :)Matlab - 19
tic;while toc<5;end
Zamień na
5
żądany czas wykonania.źródło
Go,
215212193 bajtów (pełny)Bonus, podkreśla wszystkie procesory.
Now()
W pętli jest tam kopać w harmonogramie,Now
była najkrótsza nazwa funkcji mogę znaleźć w moim nazwJeśli uruchomię,
go fmt
rozmiar wzrośnie do286277254 bajtówźródło
Bash: 19 znaków
źródło
Montaż: 16 bajtów
Edycja: Nie zauważyłem wymogu wprowadzania danych numerycznych, zamierzam twierdzić, że zajmuje jedno z wiersza poleceń, ale ignoruje je =)
źródło
Partia DOS - 5 bajtów
Partia DOS - 8 bajtów
Drugi to tłumaczenie niesławnego widełka sh.
Ctrl + C psuje program (chyba że trochę poprawiłeś ustawienia).
źródło
C #, 118
Bez kompresji
Wymaga to podania liczby jako argumentu, który jest liczbą sekund do uruchomienia. Użyje 100% jednego rdzenia przez tak długi czas lub do momentu crtl + c. Jestem prawie pewien, że jest tak mały, że C # pójdzie z jego gadatliwością.
źródło
C # - 178 znaków
I bardziej czytelny:
To 178 znaków w C # i wykorzystuje wszystkie rdzenie.
Jedyną słabością jest to, że zawsze kończy się z powodu limitu liczby całkowitej 1 << 30.
źródło
Java - 88 znaków
Pozwala to na 2⁶³-1 pętli.
Bardziej czytelna wersja
C # - 87 znaków
Bardziej czytelna wersja
(Jest to system 4-rdzeniowy)
źródło
EcmaScript 6:
To zużyje 100% procesora na maszynie z jednym rdzeniem, a dzięki Firefox ma dodatkową zaletę, że Firefox zużywa coraz więcej pamięci; cały interfejs się blokuje, a jedynym sposobem na jego zatrzymanie jest zabicie Firefoksa w menedżerze zadań.
źródło
perl, 23 bajty
Nie mogę wymyślić, jak wkleić tutaj literalną kombinację-T, więc zamiast tego wpisałem $ ^ T, ale jedno z nich działa (literał jest o 1 znak krótszy przy 23 bajtach):
$ ^ T to tylko czas uruchomienia interpretera, więc możesz w zasadzie odczytać to jako time (), ponieważ jest to pierwsza rzecz, którą obliczamy.
źródło
Python, 30
Ta stara łamigłówka była dla mnie interesująca, mam nadzieję, że można w niej odpowiedzieć na stare pytanie. Po prostu nie mogłem pozwolić, aby odpowiedzi C pokonały Pythona. ;)
sum(range(int(input())*2**26))
To wymaga dostrojenia dla różnych procesorów, ale nie sądzę, że narusza OP ...
sum(range(2**27))
peguje jeden z moich rdzeni i7 2,8 GHz przez około sekundę. :)źródło
must produce 100% CPU load until aborted
.must take a numeric input, representing the number seconds the stress-test should run
. Aby kod musiał w jakiś sposób pobierać dane wejściowe użytkownika i odpowiednio się ograniczać, a także po prostu ustalać procesor. To jest najbardziej interesująca dla mnie zagadka ...