Introdução
Existem muitos utilitários por aí capazes de criar uma carga de CPU alta para testar seu (s) processador (es). No Microsoft Windows, você pode até usar o on-board calculator.exe
, digitar um número grande como 999999999
e pressionar n!
várias vezes para fazer com que suas CPUs trabalhem horas extras.
Mas o que há em uma solução se você não a criou?
A missão
Sua missão - se você optar por aceitá-la - é criar a menor ferramenta de teste de estresse da CPU do planeta.
Devo…
- deve produzir 100% de carga da CPU até ser abortado
- deve receber uma entrada numérica, representando o número de segundos que o teste de estresse deve executar
- deve permitir a interação do usuário (pressionar a tecla, fechar a janela do terminal ou algo assim), o que deve permitir ao usuário interromper o teste de estresse e / ou sair do programa
- deve segmentar o Microsoft Windows, Mac OSx e / ou Linux.
(Mesmo um hamster pode estressar um Comodore64 ... portanto, você deve direcionar para um sistema operacional atual.)
Não deve…
- não deve usar programas ou ferramentas de terceiros que substituam a funcionalidade esperada.
(Propor atalhos comosystem('cpuStressThing.exe')
desqualifica sua proposta).
Posso…
- pode usar qualquer abordagem / algoritmo / funcionalidade para produzir 100% da carga esperada da CPU
- pode usar qualquer linguagem de programação ou de script
(desde que permita uma verificação prática de sua funcionalidade executando-a)
Condição vencedora
Apresente o menor código fonte possível. O vencedor é o que apresenta o código-fonte mais mínimo (em tamanho) que atende às condições "obrigatórias" e "não obrigatórias" acima. Agora, faça aquele bebê queimar ...
EDITAR
Desde que a pergunta surgiu na área de comentários ... você só precisa direcionar 1 núcleo da CPU. Definitivamente, não estou esperando que você produza uma solução multinúcleo. Afinal, isso deve ser divertido - não funciona.
Respostas:
Bash e utilitários padrão,
363122292826 bytesfonte
:
nodo :; done
. Descobri quedo;done
faz o trabalho - isso o levará em 2 bytes. Também +1 por ser quase a metade do comprimento da minha solução bash (eu a tornei muito complicada sem um bom motivo como esqueci$!
).bash: syntax error near unexpected token `;'
. Eu tentei estas versões festança: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
resposta, então ;-)$1
no lugar10
, apenas para transformá-lo em um script que "aceita entrada numérica".Bash / iputils (Linux), 14 bytes
Inunda o endereço nulo IPv6 até que o cronômetro de prazo -w expire
ressalva - consome apenas 55-60% da CPU na minha VM de testeEdit: - Retiro minha advertência. Enquanto os
top
relatórios relatam que oping6
processo consome apenas 55-60% da CPU, vejo a porcentagem total de inatividade da CPU (VM de 2 núcleos) se aproximar de zero. Presumivelmente, isso ocorre porque boa parte do processamento está acontecendo no kernel enquanto ele lida com os pacotes.Nota - deve ser executado como root. Como comenta a @Tobia, isso parece ser um requisito razoável para algo que irá sobrecarregar a CPU. E o OP o aprovou nos comentários.
fonte
sudo
e apenas declarar que o teste deve ser executado como root. Parece um requisito razoável para algo que monopolizará a CPU.ping -6 :: -t
-> somente se isso no Windows fez com que minha CPU ficasse selvagem ... É apenas o equivalente do Linux no Windows, que apenas gera erros e nem carrega a CPU em 1%! Estou usando o windows 8 pro x64 em um core2quad 2.63GHz.Elf32 binário autônomo - 86 bytes
Aposto que este é o menor binário de formato Elf corretamente formado que pode ser criado para executar essa função. Isso será executado sem nenhum suporte adicional em qualquer plataforma baseada em Linux, ou potencialmente mesmo sem um sistema operacional .
Download binário: http://ge.tt/3m6h2cK1/v/0?c
Despejo hexagonal:
Isso é feito construindo um arquivo asm com um cabeçalho Elf mínimo próprio e ignorando o uso de todos
ld
.Montagem:
Construído com
nasm -f bin tiny_cpu_stresser_elf32.asm -o tiny_cpu_stresser_elf32
fonte
bash builtins apenas 20 bytes
fonte
C, 52
Pressione Ctrl + C para sair.
fonte
$i=<>
peça e adicionar<?
ao início e você estará pronto!Perl, 32
Agora a parte embaraçosa: eu tolamente coloquei
$t=time
na frente$i=<>
e estava tentando furiosamente descobrir por que ela sai alguns segundos antes.Novamente, Ctrl + C para sair.
fonte
Unix C, 47
Passe o tempo na linha de comando. A tecla de interrupção (Ctrl-C) é interrompida.
fonte
scanf
truque do @ ace , poderá reduzi-lo para 39:main(a){for(scanf("%d",&a),alarm(a);;);}
Smalltalk (Smalltalk / X), 34
entrada: n; interrompa com CTRL-c ou CMD-.
pode jogar golfe melhor, se medido em dias ;-) (brincando):
ou a partir de uma linha de comando:
fonte
Esta não é uma tentativa séria, mas ...
Bash, 12 bytes
Como encontrado na Wikipedia .
AVISO: código nocivo, não o execute no seu computador!
Tecnicamente:
- Produz 100% de carga da CPU até o sistema travar;
- Permite que a interação do usuário o pare (se você conseguir matar todos os garfos, poderá realmente pará-lo ...);
- Você pode fornecer uma entrada numérica que representa o número de segundos que deve ser executado, mas não a usará.
fonte
PHP
4340 bytes:Espero que esta seja uma resposta aceitável:
set_time_limit ($ _ REQUEST ['t']); while (! 0);Eu poderia fazer assim:
<?for(set_time_limit($_POST['t']);;);
mas perderia flexibilidade e 3 bytes.E eu poderia enganar e fazer assim:
<?for(set_time_limit($_REQUEST[t]);;);
. Ele remove 2 bytes, mas não é uma solução "padrão". Vamos manter o jogo justo.Como @fireeyedboy e @primo sugeriram, você também pode usar esta solução (34 bytes):
Isso permite que seja usado no console, chamando assim:
Como eu disse, não estou direcionando a solução de console, mas eles precisam receber o crédito por essa.
Outra resposta pode ser esse "monstro", que é apenas as duas respostas combinadas:
É impossível obter pressionamentos de tecla no php, sem estar no console, o que não estou direcionando!
Para interromper, você DEVE interromper o processo (interromper o carregamento da página pode interromper o código)!
Além disso, ele também funciona no Android! Se você instalar um servidor php (gratuito no Google Play).
Para fazê-lo funcionar, basta fazer o seguinte:
Você cria uma página da web .php e anexa
?t=<time in seconds>
ao final do URL ou envia uma postagem (usando um formulário ou mesmo ajax).fonte
$_REQUEST['t']
por$argv[1]
e chame-a com:php -f cpustresstest.php <timelimit>
e aborte com^C
.$_GET
vez de$_REQUEST
? 4 bytes e você estiver usandoGET
qualquer maneiraBrainFuck / Extended BrainFuck : 3
Ele usará 100% da CPU em um núcleo até ser abortado. Todos os programas Brainfuck são programas EBF válidos.
Zozotez LISP : 7
1519Ao usar o pequeno driver.
Como uma expressão autônoma sem um driver: 15
Uso:
echo '((\(L)(L))(\()(L)))' | jitbf zozotez.bf
fonte
Perl - 14 bytes
Define a
SIGALRM
para ser enviado eminput
segundos, que finaliza o script. Enquanto isso, ele gira em uma espera ocupada.Uso da amostra:
Perl - 12 (+1) bytes
Se as opções de linha de comando forem contadas como um byte cada, isso poderá ser reduzido para 13 bytes usando um
-n
:Uso da amostra:
fonte
montagem x86_64 no Linux - 146 (origem), 42 (código montado)
A fonte minificada NASM (146 bytes):
Aceita um parâmetro na linha de comando que especifica o número de segundos a serem executados no intervalo (0, 9999999]; pode ser interrompido com o Ctrl-C usual.
Você pode montá-lo com
Em teoria, seria necessário adicionar um
global _start
seguido por um_start:
rótulo no início, masld
conseguiu consertá-lo por si só com pouco barulho.O código de máquina correspondente (42 bytes):
(gerado com a
nasm
adição doBITS 64
diretiva)Uma versão um pouco mais legível:
fonte
Python,
585551Uau ... mais do que o C. Tem que haver uma maneira melhor.Ainda um pouco longo, mas pelo menos supera a solução C!fonte
Java -
154 148186Erro estranho comeu minha
Thread.sleep()
partee uma versão mais legível:
Cria um
new Thread
com um loop infinito agradável (for(;;);
) e, em seguida, no thread principal athread.sleep()
eSystem.exit(0)
depois de timeout para sair; ctrl-c sai, também no cmdline não foi possível abreviar issoexit()
. bater não funcionará;fonte
Lote, 2 caracteres
%0
Em essência, o programa constantemente se inicia repetidamente. Seus resultados podem variar devido à prioridade de alocação de tarefas do processador, mas funciona para mim.
fonte
Powershell,
185450 bytesPara produzir 100% de carga para todos os núcleos da CPU.
| AddS*
é o atalho para o.AddSeconds()
métodosajb
é o alias doStart-Job
cmdlet.fonte
must take a numeric input, representing the number seconds the stress-test should run
)?Linux sh e utilitários padrão, 14
O gnu coreutils recente inclui um
timeout
utilitário que é útil:fonte
timeout $1 yes :|sh
- 19 é provavelmente o melhor que você pode fazer e obter 100% de utilização. Tentados a roubar este para a minha resposta, mas eu vou estar desportista-like :)Matlab - 19
tic;while toc<5;end
Substitua
5
pelo tempo de execução desejado.fonte
Ir,
215212193 bytes (completo)Bônus, enfatiza todas as CPUs.
O
Now()
loop está lá para chutar o agendador,Now
foi o nome mais curto da função que pude encontrar no meu namespaceSe eu executar,
go fmt
o tamanho aumenta para286277254 bytesfonte
Bash: 19 caracteres
fonte
Montagem: 16 bytes
Edit: Não tendo notado o requisito de receber uma entrada numérica, vou afirmar que é preciso uma na linha de comando, mas a ignora =)
fonte
Lote DOS - 5 bytes
Lote DOS - 8 bytes
O segundo é uma tradução da infame sh forkbomb.
Ctrl + C interrompe o programa (a menos que você tenha ajustado um pouco as configurações).
fonte
C #, 118
Descomprimido
Isso requer um número como argumento, que é o número de segundos para executar. Ele usará 100% de um núcleo por tanto tempo ou até crtl + c. Eu tenho certeza que isso é tão pequeno quanto C # vai com sua verbosidade.
fonte
C # - 178 caracteres
E mais legível:
Isso é 178 caracteres em C # e usa todos os núcleos.
A única fraqueza que está sempre terminando devido ao limite de 1 << 30 inteiro.
fonte
Java - 88 caracteres
Isso permite 2⁶³-1 loops.
Versão mais legível
C # - 87 caracteres
Versão mais legível
(Este é um sistema de 4 núcleos)
fonte
EcmaScript 6:
Isso usará 100% da CPU em uma máquina de núcleo único e, com o Firefox, possui o bônus adicional de o Firefox continuar consumindo cada vez mais memória; toda a interface trava e a única maneira de pará-la é matar o Firefox no gerenciador de tarefas.
fonte
perl, 23 bytes
Não consigo descobrir como colar um controle literal-T aqui, então digitei $ ^ T, mas funciona (o literal é 1 caractere mais curto em 23 bytes):
$ ^ T é exatamente a hora em que o intérprete iniciou, então você pode basicamente lê-lo como time (), pois é a primeira coisa que calculamos.
fonte
Python, 30
Achei esse velho quebra-cabeça interessante, espero que seja bom postar uma resposta para uma pergunta antiga. Eu simplesmente não podia deixar as respostas C vencerem o Python. ;)
sum(range(int(input())*2**26))
Isso precisa ser ajustado para diferentes CPUs, mas não acho que isso viole o OP ...
sum(range(2**27))
prende um dos meus núcleos i7 de 2,8 GHz por cerca de um segundo. :)fonte
must produce 100% CPU load until aborted
.must take a numeric input, representing the number seconds the stress-test should run
. Para que o código precise receber de algum modo a entrada do usuário e se autolimite de acordo, além de apenas fixar uma CPU. Esta é a parte que eu achei mais interessante sobre o quebra-cabeça ... #