pengantar
Ada banyak utilitas di luar sana yang mampu menciptakan beban CPU yang tinggi untuk menguji-stres prosesor Anda. Di Microsoft Windows, Anda bahkan dapat menggunakan on-board calculator.exe
, memasukkan angka seperti 999999999
, dan menekan n!
beberapa kali untuk membuat CPU Anda bekerja lembur.
Tapi apa solusinya jika Anda tidak membuatnya sendiri?
Misi
Misi Anda - jika Anda memilih untuk menerimanya - adalah menciptakan alat uji stres CPU terkecil di planet ini.
Harus…
- harus menghasilkan 100% beban CPU hingga dibatalkan
- harus mengambil input numerik, mewakili angka detik stress-test harus dijalankan
- harus memungkinkan interaksi pengguna (penekanan tombol, jendela terminal penutupan, atau sesuatu seperti itu) yang harus memungkinkan pengguna untuk membatalkan stress-test dan / atau keluar dari program
- harus menargetkan Microsoft Windows, Mac OSx, dan / atau Linux.
(Bahkan seekor hamster dapat menekankan Comodore64 ... karena itu, Anda harus menargetkan sistem operasi saat ini.)
Tidak harus…
- tidak boleh menggunakan program atau alat pihak ketiga yang menggantikan fungsi yang diharapkan.
(Mengusulkan cara pintas sepertisystem('cpuStressThing.exe')
mendiskualifikasi proposal Anda.)
Mungkin…
- dapat menggunakan pendekatan / algoritma / fungsionalitas apa pun untuk menghasilkan 100% beban CPU yang diharapkan
- dapat menggunakan bahasa pemrograman atau skrip apa saja
(asalkan memungkinkan verifikasi praktis fungsinya dengan menjalankannya)
Kondisi Menang
Hadirkan kode sumber sekecil mungkin. Pemenangnya adalah yang menyajikan kode sumber paling minimal (dalam ukuran) yang memenuhi syarat "harus" dan "tidak boleh" di atas. Sekarang, buat bayi itu terbakar ...
EDIT
Karena pertanyaan muncul di area komentar ... Anda hanya perlu menargetkan 1 inti CPU. Saya jelas tidak mengharapkan Anda untuk menghasilkan solusi multi-core. Bagaimanapun, ini harusnya menyenangkan - bukan bekerja.
Jawaban:
Bash dan utilitas standar,
363122292826 bytesumber
:
masukdo :; done
. Saya telah menemukando;done
pekerjaan - yang akan menarik Anda dalam 2 byte. Juga +1 karena hampir setengah panjang dari solusi bash saya (saya membuatnya terlalu rumit tanpa alasan yang baik karena saya lupa tentang$!
).bash: syntax error near unexpected token `;'
. Saya sudah mencoba versi pesta ini: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
jawaban 34-byte lalu ;-)$1
di10
sana, hanya untuk membuatnya menjadi skrip yang "mengambil input numerik".Bash / iputils (Linux), 14 byte
Banjir-ping alamat IPv6 null, sampai -w tenggat waktu berakhir
peringatan - hanya mengkonsumsi 55-60% CPU pada VM pengujian sayaSunting: - Saya menarik kembali peringatan saya. Sementara
top
melaporkanping6
proses hanya mengkonsumsi 55-60% CPU, saya melihat persentase total CPU idle (2 core VM) mendekati nol. Ini mungkin karena banyak proses yang terjadi di kernel karena menangani paket-paket.Catatan - harus dijalankan sebagai root. Seperti komentar @Tobia, ini sepertinya persyaratan yang masuk akal untuk sesuatu yang akan memakan CPU. Dan OP menyetujuinya dalam komentar.
sumber
sudo
dan hanya menyatakan bahwa tes harus dijalankan sebagai root. Sepertinya persyaratan yang masuk akal untuk sesuatu yang akan memakan CPU.ping -6 :: -t
-> hanya jika ini pada windows membuat cpu saya menjadi liar ... Ini hanya setara linux di windows, yang hanya memberikan kesalahan dan bahkan tidak memuat cpu pada 1%! Saya menggunakan windows 8 pro x64 pada core2quad 2.63GHz.Elf32 biner mandiri - 86 byte
Saya yakin ini adalah biner format Elf terkecil yang terbentuk dengan benar yang dapat dibuat untuk melakukan fungsi ini. Ini akan dijalankan tanpa dukungan tambahan pada platform berbasis linux apa pun, atau berpotensi bahkan tanpa sistem operasi .
Unduhan biner: http://ge.tt/3m6h2cK1/v/0?c
Hex dump:
Ini dilakukan dengan membangun file asm dengan header Elf minimal sendiri, dan melewatkan penggunaan
ld
semuanya.Majelis:
Dibangun dengan
nasm -f bin tiny_cpu_stresser_elf32.asm -o tiny_cpu_stresser_elf32
sumber
bash builtins hanya 20 byte
sumber
C, 52
Tekan Ctrl + C untuk keluar.
sumber
$i=<>
bagian dan tambahkan<?
ke awal dan Anda baik untuk pergi!Perl, 32
Sekarang bagian yang memalukan: Aku dengan bodohnya meletakkan
$t=time
di depan$i=<>
dan dengan marah berusaha mencari tahu mengapa itu keluar beberapa detik lebih awal.Sekali lagi, Ctrl + C untuk keluar.
sumber
Unix C, 47
Lewati waktu pada baris perintah. Kunci interupsi (Ctrl-C) dibatalkan.
sumber
scanf
trik @ ace , Anda bisa mendapatkan ke 39:main(a){for(scanf("%d",&a),alarm(a);;);}
Smalltalk (Smalltalk / X), 34
masukan: n; interupsi dengan CTRL-c atau CMD-.
bisa bermain golf lebih baik, jika diukur dalam hari ;-) (hanya bercanda):
atau dari baris perintah:
sumber
Ini bukan upaya serius untuk itu, tapi ...
Bash, 12 byte
Seperti yang ditemukan di Wikipedia .
PERINGATAN: kode berbahaya, jangan jalankan di komputer Anda!
Secara teknis:
- Ini menghasilkan 100% beban CPU sampai sistem crash;
- Mengizinkan interaksi pengguna untuk menghentikannya (jika Anda berhasil membunuh semua garpu, Anda benar-benar dapat menghentikannya ...);
- Anda bisa memberikannya input numerik yang mewakili jumlah detik yang harus dijalankan, tetapi itu tidak akan menggunakannya.
sumber
PHP
4340 byte:Saya harap ini jawaban yang bisa diterima:
set_time_limit ($ _ REQUEST ['t']); while (! 0);Saya bisa melakukan ini:
<?for(set_time_limit($_POST['t']);;);
tetapi akan kehilangan fleksibilitas dan 3 byte.Dan saya bisa menipu dan melakukan seperti ini:
<?for(set_time_limit($_REQUEST[t]);;);
. Ini memangkas 2 byte, tapi itu bukan solusi "standar". Mari kita menjaga permainan tetap adil.Seperti yang disarankan @fireeyedboy dan @primo, Anda juga dapat menggunakan solusi ini (34 byte):
Ini memungkinkan penggunaannya dari konsol, menyebutnya seperti ini:
Seperti yang saya katakan, saya tidak menargetkan solusi konsol, tetapi mereka harus mendapatkan kredit untuk yang satu ini.
Jawaban lain bisa berupa "monster" ini, yang hanya merupakan gabungan kedua jawaban:
Tidak mungkin mendapatkan penekanan tombol di php, tanpa di konsol, yang tidak saya targetkan!
Untuk menghentikannya, Anda HARUS membatalkan prosesnya (menghentikan halaman dari memuat mungkin menghentikan kode)!
Sebagai nilai tambah, ini juga berfungsi di Android! Jika Anda menginstal server php (gratis di Google Play).
Untuk membuatnya bekerja, lakukan saja seperti ini:
Anda membuat halaman web .php dan menambahkan
?t=<time in seconds>
ke akhir url atau mengirim posting (menggunakan formulir atau bahkan ajax).sumber
$_REQUEST['t']
dengan$argv[1]
lalu panggil dengan:php -f cpustresstest.php <timelimit>
dan batalkan dengan^C
.$_GET
bukan$_REQUEST
? 4 byte dan AndaGET
tetap menggunakanBrainFuck / Extended BrainFuck : 3
Ini akan menggunakan 100% CPU pada satu inti sampai dibatalkan. Semua program Brainfuck adalah program EBF yang valid.
Zozotez LISP : 7
1519Saat menggunakan driver kecil.
Sebagai ekspresi mandiri tanpa pengemudi: 15
Pemakaian:
echo '((\(L)(L))(\()(L)))' | jitbf zozotez.bf
sumber
Perl - 14 byte
Set a
SIGALRM
untuk dikirim dalaminput
detik, yang mengakhiri skrip. Sementara itu, ia berputar dalam penantian yang sibuk.Penggunaan sampel:
Perl - 12 (+1) byte
Jika opsi baris perintah dihitung masing-masing satu byte, ini dapat dikurangi menjadi 13 byte menggunakan
-n
:Penggunaan sampel:
sumber
x86_64 rakitan di Linux - 146 (sumber), 42 (kode rakitan)
Sumber yang diperkecil NASM (146 byte):
Menerima parameter pada baris perintah yang menetapkan jumlah detik untuk dijalankan dalam kisaran (0, 9999999]; dapat diinterupsi dengan Ctrl-C yang biasa.
Anda dapat merakitnya dengan
Secara teori akan perlu untuk menambahkan
global _start
diikuti oleh_start:
label di awal, tetapild
berhasil memperbaikinya sendiri dengan sedikit keributan.Kode mesin yang sesuai (42 byte):
(dihasilkan dengan
nasm
menambahkanBITS 64
arahan)Versi yang lebih mudah dibaca:
sumber
Python,
585551Wow ... lebih lama dari C satu. Pasti ada cara yang lebih baik.Masih agak lama, tapi setidaknya itu mengalahkan solusi C!sumber
Jawa -
154 148186Kesalahan aneh memakan
Thread.sleep()
bagian sayadan versi yang lebih mudah dibaca:
Memunculkan
new Thread
dengan loop tak berujung yang bagus (for(;;);
) lalu pada utas utamathread.sleep()
danSystem.exit(0)
setelah batas waktu untuk keluar; ctrl-c keluar, juga pada cmdline tidak dapat menyingkatnyaexit()
. menabrak tidak akan bekerja;sumber
Batch, 2 karakter
%0
Intinya, program terus-menerus memulai sendiri. Hasil Anda dapat bervariasi, karena prioritas alokasi tugas prosesor, tetapi itu berfungsi untuk saya.
sumber
Powershell,
185450 byteUntuk menghasilkan beban 100% untuk semua core CPU.
| AddS*
adalah jalan pintas untuk.AddSeconds()
metode.sajb
adalah alias untukStart-Job
cmdlet.sumber
must take a numeric input, representing the number seconds the stress-test should run
)?Linux sh dan utilitas standar, 14
Coreuils gnu baru-baru ini mencakup
timeout
utilitas yang bermanfaat:sumber
timeout $1 yes :|sh
- 19 mungkin adalah yang terbaik yang dapat Anda lakukan dan dapatkan utilisasi 100%. Tergoda untuk mencuri ini untuk jawaban saya, tetapi saya akan seperti olahragawan :)Matlab - 19
tic;while toc<5;end
Ganti
5
dengan waktu eksekusi yang diinginkan.sumber
Go,
215212193 byte (penuh)Bonus, menekankan semua CPU.
Di
Now()
dalam loop ada di sana untuk menendang penjadwal,Now
adalah nama fungsi terpendek yang bisa saya temukan di namespace sayaJika saya menjalankan
go fmt
ukuran meningkat menjadi286277254 bytesumber
Bash: 19 karakter
sumber
Majelis: 16 byte
Sunting: Setelah tidak memperhatikan persyaratan untuk mengambil input numerik, saya akan mengklaim itu mengambil satu di commandline, tetapi mengabaikannya =)
sumber
DOS Batch - 5 byte
DOS Batch - 8 byte
Kedua adalah terjemahan dari forkbomb sh yang terkenal.
Ctrl + C merusak program (kecuali jika Anda sedikit mengubah pengaturan).
sumber
C #, 118
Tidak terkompresi
Ini membutuhkan angka sebagai argumen yang merupakan jumlah detik untuk dijalankan. Ini akan menggunakan 100% dari satu inti untuk waktu sebanyak itu atau sampai crtl + c. Saya cukup yakin ini sekecil C # akan sesuai dengan verbositasnya.
sumber
C # - 178 karakter
Dan lebih mudah dibaca:
Itu 178 karakter di C # dan menggunakan semua core.
Satu-satunya kelemahan yang selalu berakhir karena 1 << 30 batas integer.
sumber
Java - 88 karakter
Ini memungkinkan untuk loop 2⁶³-1.
Versi Lebih Mudah Dibaca
C # - 87 karakter
Versi Lebih Mudah Dibaca
(Ini pada sistem 4 inti)
sumber
EcmaScript 6:
Ini akan menggunakan 100% CPU pada mesin single-core, dan dengan Firefox, ia memiliki bonus tambahan bahwa Firefox terus menggunakan semakin banyak memori; seluruh antarmuka terkunci dan satu-satunya cara untuk menghentikannya adalah dengan mematikan Firefox di task manager.
sumber
perl, 23 byte
Saya tidak tahu bagaimana cara menempelkan kontrol literal-T di sini, jadi saya mengetik $ ^ T sebagai gantinya, tetapi salah satu kerjanya (literalnya adalah 1 char lebih pendek pada 23 byte):
$ ^ T hanyalah waktu penerjemah dimulai, jadi Anda pada dasarnya dapat membacanya sebagai waktu () karena ini adalah hal pertama yang kami hitung.
sumber
Python, 30
Saya menemukan puzzle lama ini menarik, saya harap tidak apa-apa untuk mengirim jawaban atas pertanyaan lama. Saya tidak bisa membiarkan jawaban C mengalahkan Python. ;)
sum(range(int(input())*2**26))
Ini perlu disetel untuk CPU yang berbeda, tapi saya tidak berpikir itu melanggar OP ...
sum(range(2**27))
mematok salah satu dari core i7 2.8GHz saya selama sekitar satu detik. :)sumber
must produce 100% CPU load until aborted
.must take a numeric input, representing the number seconds the stress-test should run
. Sehingga kode perlu mengambil input pengguna entah bagaimana dan membatasi diri sesuai, serta hanya mematok CPU. Ini adalah bagian yang saya temukan paling menarik tentang teka-teki ...