2008-12-19 20 views
9

Je suis en train de tester certains process. Mon application doitgénérer la charge du processeur en Java

  1. lecture de JMS
  2. Effectuer un traitement
  3. écrire à
  4. JMS

Mon but ici est de simuler # 2, «un certain traitement. C'est-à-dire, introduire un retard et occuper la CPU pendant un temps donné (par exemple 500 ms) avant de transmettre l'événement. L'approche naïve serait de Thread.sleep(500). Cela introduirait le bon retard dans l'exécution, mais n'exercerait pas le CPU.

Le calcul des nombres de Fibonacci est une option. Est-ce que quelqu'un a utilisé des techniques intéressantes pour maintenir le (s) processeur (s) occupé (s) pendant un certain temps?

caractéristiques idéales seraient:

  • Réalise une variété d'instructions, plutôt que (par exemple) filer juste sur une boucle
  • Pas quelque chose que la machine virtuelle HotSpot va optimiser l'écart à rien
  • A un moyen facile d'ajuster la période de traitement vers le haut ou vers le bas (le temps de terminer variera clairement compte tenu du matériel)
+0

Pouvez-vous expliquer davantage pourquoi l'utilisation de la CPU est nécessaire, mais simplement dormir avec filetage.dormir() ne convient pas? –

+0

Je ne suis pas sûr de comprendre ce que vous entendez par "exercer le processeur" et pourquoi exactement vous devriez le faire. Pourriez-vous élaborer un peu plus? Que faites-vous exactement ici? D'après ce que je peux voir c'est soit le "certains traitement", lire/écrire JMS ou quelque chose qui envoie des données à cette chose. Merci. –

+0

> sleep ne convient pas J'ai besoin que les opérations JMS se déroulent dans des conditions d'UC réalistes. Un processeur inactif peut me donner des performances JMS faussement élevées; J'ai besoin de l'UC pour être 'réaliste' donc ma mesure JMS est bonne. – Air

Répondre

3

Chiffrer une chaîne (dans al oop) en appelant Cipher.update(). Les algorithmes de chiffrement sont par définition très difficiles à optimiser. Le seul problème est qu'il y a une configuration non triviale que vous devez effectuer. Je marque cette réponse en tant que wiki de communauté, de sorte que quelqu'un qui l'a écrit récemment peut le remplir.

2

Créer une très grande collection d'objets aléatoires, puis d'autres appels à Collections.shuffle() et Collections.sort(). J'ai utilisé Jakarta Commons Lang pour générer des chaînes aléatoires à des fins de mélange/tri.

8

Vous pouvez essayer quelque chose de simple comme

private static void spin(int milliseconds) { 
    long sleepTime = milliseconds*1000000L; // convert to nanoseconds 
    long startTime = System.nanoTime(); 
    while ((System.nanoTime() - startTime) < sleepTime) {} 
} 

Test:

public static void main(String[] args) { 
    final int NUM_TESTS = 1000; 
    long start = System.nanoTime(); 
    for (int i = 0; i < NUM_TESTS; i++) { 
     spin(500); 
    } 
    System.out.println("Took " + (System.nanoTime()-start)/1000000 + 
     "ms (expected " + (NUM_TESTS*500) + ")"); 
} 

Ma sortie:

$ java SpinTest 
Took 500023ms (expected 500000) 

Ainsi, la boucle ne ne soient pas optimisés (et oui, je a dopé mon processeur à 100% pendant huit minutes juste pour tester ceci :)).

0

Créez une matrice et effectuez quelques manipulations matricielles.

Vous pouvez régler cela assez facilement en faisant varier la taille de la matrice.

0

Encore une autre des choses que vous pouvez utiliser, peut-être:

 long start = System.currentTimeMillis(); 
     long count = 0l; 
     for(long x=0;x<Integer.MAX_VALUE ;x++){ 
      count+=1; 
     } 
     long end = System.currentTimeMillis(); 
     System.out.println(end-start +" ms");