2013-10-17 4 views
-5

Ceci est une question très particulière. Je me demande quel est le meilleur moyen de créer beaucoup de décalage lors de l'exécution de ce programme Java. Peu importe la vitesse de l'ordinateur, je veux que ce programme Java provoque un retard processeur agaçant jusqu'à ce que le programme soit arrêté. Comment suis-je garanti d'y parvenir? Quelles sont les méthodes les plus efficaces?Comment créer un décalage en Java?

Jusqu'à présent, la seule chose que j'ai réussi modérément est

while (true) {} 

Mais même cela peut parfois être peu fiables si l'ordinateur de l'utilisateur est rapide. J'utilise ceci pour effectuer quelques expériences scientifiques sur combien un groupe d'ordinateurs peut gérer.

+0

Assez ironique compte tenu de votre surnom. Pourquoi ne pas essayer de lire quelque chose lentement et souvent? – icedwater

+0

C'est une question ridicule, mais OK.Créer un tas de threads et les exécuter tous, avec toutes leurs exécutions étant une boucle infinie. Ça va créer beaucoup de "lag" puis finalement écraser la JVM – Kon

+0

Haha oui c'est très bizarre mais je fais quelques expériences pour voir combien certains ordinateurs peuvent gérer. – Confiqure

Répondre

0

Je ne suis pas sûr que je ne comprends exactement ce que vous voulez, mais il est peu probable que vous obtiendrez en utilisant un fil sungle et une boucle sans fin vide. Tout d'abord, ce programme utilisera au plus un thread système et, par conséquent, un seul cœur CPU. Deuxièmement, le compilateur hotspot est susceptible d'optimiser votre boucle vide (ou toute opération arithmétique ou assignation à une variable qui ne sera jamais utilisée). Donc quoi que vous vouliez accomplir, vous devez faire quelque chose que l'optimiseur n'essaiera pas d'améliorer. Donc ...

Si vous voulez ralentir l'exécution d'un programme (plutôt que l'), alors répartissez autour de Thread.sleep (1000). La machine virtuelle Java renvoie ce temps au système d'exploitation. Si votre intention est de faire travailler la JVM en attendant un événement externe (comme dans "calculer les bogomips du système"), alors vous devriez exécuter du code qui aura un effet secondaire, de sorte que l'optimiseur a gagné ' t supprimer les allocations variables inutiles. Vous pouvez, par exemple, faire des opérations arithmétiques sur un tableau, puis System.out.print() (ou n'importe quoi d'autre ...) n'importe quelle valeur de ce tableau. Notez cependant que votre processus sera toujours limité à un thread unique, et que si votre processus n'effectue aucune opération d'E/S pendant une longue période, il sera très probablement dépriorisé par le système d'exploitation, alors ne vous attendez pas à une fiabilité excessive de ce type. technique de mesure.

Si vous cherchez à caler le système, vous devez exécuter plusieurs threads, et leur faire faire soit des allocations de mémoire intensives, les opérations d'entrées-sorties, ou l'exécution du programme externe. Vous pouvez, par exemple des milliers de threads exécuter, chacun les od courir une boucle qui exécute un programme Java externe qui alloue des tampons énormes, puis d'écrire le contenu de ce tampon dans un fichier ... Eh bien, vous avez l'idée;)

0

Vous pouvez également simplement dormir le fil actuel. Cela ne crée pas de décalage, mais cela donnera au programme cet effet.

try { 
    Thread.sleep(1000); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

More information

+0

Cela ne produira pas de retard – Confiqure

+0

Il simule le décalage. – Oleksi

+0

@Oleksi 'sleep' retarde l'exécution; il ne retarde pas l'ordinateur entier en surchargeant le CPU. – Vulcan

0

Vous apprécierez l'utilitaire que j'ai posté récemment Techniques for causing consistent GC Churn aborder. J'utilise cet utilitaire pour simuler la charge sur un système pendant les tests de performances, ce qui semble assez similaire à ce que vous cherchez à faire.

Il crée et détruit un grand nombre d'objets pour une période de temps, ou en continu en arrière-plan, et peut être configuré pour mettre des quantités variables de pression sur la machine virtuelle Java. Essayez d'exécuter plusieurs à la fois être moyenne supplémentaire :)

Le code complet est disponible ici: GC Churn Gist.

+0

Cependant, je ne veux pas causer de dommages immédiats au processeur actuel. – Confiqure

+2

Ce n'est pas * réellement * dommageable. Cela va simplement ralentir la JVM. – dimo414