introduction
Il existe de nombreux utilitaires capables de créer une charge CPU élevée pour tester vos processeurs. Sous Microsoft Windows, vous pouvez même utiliser la carte intégrée calculator.exe
, saisir un grand nombre comme 999999999
et appuyer surn!
plusieurs fois pour faire fonctionner votre ou vos CPU au fil du temps.
Mais quelle est la solution si vous ne l'avez pas créée vous-même?
La mission
Votre mission - si vous l'acceptez - est de créer le plus petit outil de test de stress CPU de la planète.
Doit…
- doit produire 100% de charge CPU jusqu'à ce qu'elle soit abandonnée
- doit prendre une entrée numérique, représentant le nombre de secondes pendant lesquelles le test de résistance doit s'exécuter
- doit permettre l'interaction de l'utilisateur (pression sur une touche, fermeture de la fenêtre du terminal, ou quelque chose comme ça) qui devrait permettre à un utilisateur d'interrompre le test de résistance et / ou de quitter le programme
- doit cibler Microsoft Windows, Mac OSx et / ou Linux.
(Même un hamster pourrait stresser un Comodore64… par conséquent, vous devez cibler un système d'exploitation actuel.)
Ne doit pas…
- ne doit pas utiliser de programmes ou d'outils tiers qui remplacent les fonctionnalités attendues.
(Proposer des raccourcis commesystem('cpuStressThing.exe')
disqualifie votre proposition.)
Mai…
- peut utiliser n'importe quelle approche / algorithme / fonctionnalité pour produire 100% de la charge CPU attendue
- peut utiliser n'importe quel langage de programmation ou de script
(tant qu'il permet une vérification pratique de sa fonctionnalité en l'exécutant)
Condition gagnante
Présentez le code source le plus petit possible. Le gagnant est celui qui présente le code source le plus minimal (en taille) qui respecte les conditions ci-dessus «must» et «must not». Maintenant, fais brûler ce bébé…
MODIFIER
Depuis que la question est apparue dans la zone de commentaire… il vous suffit de cibler 1 cœur de processeur. Je ne m'attends certainement pas à ce que vous produisiez une solution multicœur. Après tout, cela devrait être amusant - pas travailler.
Réponses:
Utilitaires Bash et standard,
363122292826 octetsla source
:
entréedo :; done
. J'ai trouvé qu'ildo;done
fait le travail - cela vous tirera en 2 octets. Aussi +1 pour avoir presque la moitié de la longueur de ma solution bash (je l'ai rendue trop compliquée sans raison car j'ai oublié$!
).bash: syntax error near unexpected token `;'
. J'ai essayé ces versions de 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
réponse de 34 octets ;-)$1
à la place de10
là, juste pour en faire un script qui "prend une entrée numérique".Bash / iputils (Linux), 14 octets
Flood-pings l'adresse nulle IPv6, jusqu'à l'expiration du délai -w
mise en garde - ne consomme que 55 à 60% de CPU sur ma machine virtuelle de testEdit: - Je retire ma mise en garde. Alors que les
top
rapports indiquent que leping6
processus ne consomme que 55 à 60% de CPU, je vois le pourcentage d'inactivité total du CPU (VM à 2 cœurs) approcher de zéro. Cela est probablement dû au fait qu'une grande partie du traitement est en cours dans le noyau pendant qu'il gère les paquets.Remarque - doit être exécuté en tant que root. Comme le commente @Tobia, cela semble être une exigence raisonnable pour quelque chose qui monopolise le processeur. Et le PO l'a approuvé dans les commentaires.
la source
sudo
et simplement déclarer que le test doit être exécuté en tant que root. Cela semble être une exigence raisonnable pour quelque chose qui accaparera le processeur.ping -6 :: -t
-> seulement si cela sur windows a rendu mon cpu sauvage ... C'est juste l'équivalent linux sur windows, qui ne donne que des erreurs et ne charge même pas le cpu à 1%! J'utilise Windows 8 Pro x64 sur un core2quad 2,63 GHz.Elf32 binaire autonome - 86 octets
Je parie que c'est le plus petit binaire au format Elf correctement formé qui peut être fait pour exécuter cette fonction. Cela s'exécutera sans aucun support supplémentaire sur n'importe quelle plate-forme basée sur Linux, ou potentiellement même sans système d'exploitation .
Téléchargement binaire: http://ge.tt/3m6h2cK1/v/0?c
Vidage hexadécimal:
Cela se fait en créant un fichier asm avec un en-tête Elf minimal et en ignorant
ld
complètement l'utilisation de .Assemblée:
Construit avec
nasm -f bin tiny_cpu_stresser_elf32.asm -o tiny_cpu_stresser_elf32
la source
bash builtins seulement 20 octets
la source
C, 52
Appuyez sur Ctrl + C pour quitter.
la source
$i=<>
partie et ajoutez-la<?
au début et vous êtes prêt à partir!Perl, 32
Maintenant, la partie embarrassante: je me suis mis bêtement
$t=time
devant$i=<>
et essayais furieusement de comprendre pourquoi il sortait quelques secondes plus tôt.Encore une fois, Ctrl + C pour quitter.
la source
Unix C, 47
Passez le temps sur la ligne de commande. La touche d'interruption (Ctrl-C) s'interrompt.
la source
scanf
truc de @ ace , vous pouvez le ramener à 39:main(a){for(scanf("%d",&a),alarm(a);;);}
Smalltalk (Smalltalk / X), 34
entrée: n; interrompre avec CTRL-c ou CMD-.
peut mieux jouer au golf, si mesuré en jours ;-) (je plaisante):
ou à partir d'une ligne de commande:
la source
Ce n'est pas une tentative sérieuse, mais ...
Bash, 12 octets
Comme on le trouve sur Wikipédia .
ATTENTION: code nuisible, ne l'exécutez pas sur votre ordinateur!
Techniquement:
- Il produit 100% de charge CPU jusqu'à ce que le système plante;
- Permet l'interaction de l'utilisateur pour l'arrêter (si vous parvenez à tuer toutes les fourches, vous pouvez réellement l'arrêter ...);
- Vous pouvez lui donner une entrée numérique qui représente le nombre de secondes qu'il doit exécuter, mais il ne l'utilisera pas.
la source
PHP
4340 octets:J'espère que c'est une réponse acceptable:
set_time_limit ($ _ REQUEST ['t']); while (! 0);Je pourrais faire comme ça:
<?for(set_time_limit($_POST['t']);;);
mais cela perdrait de la flexibilité et 3 octets.Et je pourrais tricher et faire comme ceci:
<?for(set_time_limit($_REQUEST[t]);;);
. Il rase 2 octets, mais ce n'est pas une solution "standard". Permet de garder le jeu équitable.Comme l'ont suggéré @fireeyedboy et @primo, vous pouvez également utiliser cette solution (34 octets):
Cela permet son utilisation à partir de la console, en l'appelant comme ceci:
Comme je l'ai dit, je ne cible pas la solution de console, mais ils doivent obtenir le crédit pour celle-ci.
Une autre réponse pourrait être ce "monstre", qui n'est que les deux réponses combinées:
Il est impossible d'obtenir des pressions de touches en php, sans être sur la console, que je ne cible pas!
Pour l'arrêter, vous DEVEZ abandonner le processus (arrêter le chargement de la page peut arrêter le code)!
En plus, cela fonctionne aussi sur Android! Si vous installez un serveur php (gratuit sur Google Play).
Pour le faire fonctionner, faites simplement ceci:
Vous créez une page Web .php et ajoutez
?t=<time in seconds>
à la fin de l'URL ou soumettez un message (en utilisant un formulaire ou même ajax).la source
$_REQUEST['t']
par$argv[1]
puis appelez-le par:php -f cpustresstest.php <timelimit>
et abandonnez avec^C
.$_GET
place de$_REQUEST
? 4 octets et vous utilisezGET
quand mêmeBrainFuck / BrainFuck étendu : 3
Il utilisera 100% cpu sur un cœur jusqu'à ce qu'il soit abandonné. Tous les programmes Brainfuck sont des programmes EBF valides.
Zozotez LISP : 7
1519Lors de l'utilisation du petit pilote.
En tant qu'expression autonome sans pilote: 15
Usage:
echo '((\(L)(L))(\()(L)))' | jitbf zozotez.bf
la source
Perl - 14 octets
Définit a
SIGALRM
à envoyerinput
quelques secondes, ce qui met fin au script. En attendant, il tourne dans une attente occupée.Exemple d'utilisation:
Perl - 12 (+1) octets
Si les options de ligne de commande sont comptées comme un octet chacune, cela pourrait être réduit à 13 octets en utilisant
-n
:Exemple d'utilisation:
la source
Assemblage x86_64 sur Linux - 146 (source), 42 (code assemblé)
La source minifiée NASM (146 octets):
Accepte un paramètre sur la ligne de commande spécifiant le nombre de secondes à exécuter dans la plage (0, 9999999]; peut être interrompu avec le Ctrl-C habituel.
Vous pouvez l'assembler avec
En théorie, il faudrait ajouter un
global _start
suivi d'un_start:
label au début, maisld
parvient à le réparer lui-même avec peu de bruit.Le code machine correspondant (42 octets):
(généré avec l'
nasm
ajout de laBITS 64
directive)Une version un peu plus lisible:
la source
Python,
585551Wow ... plus long que le C. Il doit y avoir un meilleur moyen.Encore un peu long, mais au moins ça bat la solution C!la source
Java -
154 148186Une erreur bizarre a mangé ma
Thread.sleep()
partet une version plus lisible:
Génère un
new Thread
avec une belle boucle sans fin (for(;;);
) puis sur le thread principal athread.sleep()
et unSystem.exit(0)
délai d'attente pour quitter; ctrl-c se ferme également sur cmdlineexit()
. s'écraser ne fonctionnera pas;la source
Lot, 2 caractères
%0
En substance, le programme recommence sans cesse. Vos résultats peuvent varier en raison de la priorité d'allocation des tâches du processeur, mais cela fonctionne pour moi.
la source
Powershell,
185450 octetsPour produire 100% de charge pour tous les cœurs de CPU.
| AddS*
est le raccourci pour la.AddSeconds()
méthode.sajb
est l'alias de l'Start-Job
applet de commande.la source
must take a numeric input, representing the number seconds the stress-test should run
)?Linux sh et utilitaires standard, 14
Gnu coreutils récent inclut un
timeout
utilitaire qui est utile:la source
timeout $1 yes :|sh
- 19 est probablement le meilleur que vous puissiez faire et obtenir une utilisation à 100%. Tenté de voler cela pour ma réponse, mais je serai comme un sportif :)Matlab - 19
tic;while toc<5;end
Remplacez
5
par le temps d'exécution souhaité.la source
Aller,
215212193 octets (complet)Bonus, souligne tous les CPU.
Le
Now()
dans la boucle est là pour lancer le planificateur,Now
était le nom de fonction le plus court que j'ai pu trouver dans mon espace de nomsSi je lance
go fmt
la taille augmente à286277254 octetsla source
Bash: 19 caractères
la source
Assemblage: 16 octets
Edit: N'ayant pas remarqué la nécessité de prendre une entrée numérique, je vais prétendre qu'elle en prend une sur la ligne de commande, mais l'ignore =)
la source
Lot DOS - 5 octets
Lot DOS - 8 octets
La seconde est une traduction de l'infâme fourche sh.
Ctrl + C interrompt le programme (sauf si vous avez légèrement modifié les paramètres).
la source
C #, 118
Non compressé
Cela nécessite un nombre comme argument qui est le nombre de secondes à exécuter. Il utilisera 100% d'un cœur pendant autant de temps ou jusqu'à crtl + c. Je suis sûr que c'est aussi petit que C # ira avec sa verbosité.
la source
C # - 178 caractères
Et plus lisible:
C'est 178 caractères en C # et utilise tous les cœurs.
La seule faiblesse qu'il finit toujours à cause de la limite de 1 << 30 entier.
la source
Java - 88 caractères
Cela permet des boucles de 2⁶³-1.
Version plus lisible
C # - 87 caractères
Version plus lisible
(Ceci est sur un système à 4 cœurs)
la source
EcmaScript 6:
Cela utilisera 100% du CPU sur une machine monocœur, et avec Firefox, il a le bonus supplémentaire que Firefox continue à utiliser de plus en plus de mémoire; toute l'interface se bloque et la seule façon de l'arrêter est de tuer Firefox dans le gestionnaire de tâches.
la source
perl, 23 octets
Je ne peux pas comprendre comment coller un littéral control-T ici, j'ai donc tapé $ ^ T à la place, mais l'un ou l'autre fonctionne (le littéral est 1 caractère plus court à 23 octets):
$ ^ T est juste l'heure à laquelle l'interpréteur a commencé, vous pouvez donc le lire comme time () car c'est la première chose que nous calculons.
la source
Python, 30
J'ai trouvé ce vieux puzzle intéressant, j'espère que c'est OK pour poster une réponse à une vieille question. Je ne pouvais tout simplement pas laisser les réponses C battre Python. ;)
sum(range(int(input())*2**26))
Cela doit être réglé pour différents processeurs, mais je ne pense pas que cela viole l'OP ... fixe
sum(range(2**27))
un de mes cœurs i7 à 2,8 GHz pendant environ une seconde. :)la source
must produce 100% CPU load until aborted
.must take a numeric input, representing the number seconds the stress-test should run
. Pour que le code doive prendre en quelque sorte les entrées de l'utilisateur et se limiter en conséquence, ainsi que simplement attacher un processeur. C'est la partie que j'ai trouvée la plus intéressante du puzzle ...