2008-12-19 12 views
9

Estoy realizando algunas pruebas de rendimiento. Mi solicitud tiene quegenerar carga de CPU en Java

  1. lectura desde JMS
  2. hacer algún procesamiento
  3. escritura a JMS

Mi objetivo aquí es para simular # 2, 'algún tipo de procesamiento'. Es decir, introduzca un retraso y ocupe la CPU durante un tiempo determinado (por ejemplo, 500 ms) antes de reenviar el evento.

El enfoque ingenuo sería Thread.sleep(500). Esto introduciría el retraso correcto en la ejecución, pero no ejercitaría la CPU.

Cálculo de números de Fibonacci es una opción. ¿Alguien ha utilizado alguna técnica interesante solo para mantener las CPU ocupadas durante un tiempo determinado?

características ideales serían:

  • realiza una serie de instrucciones, en lugar de (por ejemplo) simplemente girando sobre un bucle
  • No es algo que el HotSpot VM va a optimizar hasta desaparecer
  • Tiene una manera fácil de ajustar el período de procesamiento hacia arriba o hacia abajo (el tiempo para completar variará claramente dado el hardware)
+0

Puede explicar mejor por qué la utilización de la CPU es necesaria, sino que simplemente dormir con rosca.dormir() no es adecuado? –

+0

No estoy seguro de entender lo que quiere decir con "ejercitar la CPU" y por qué exactamente tendría que hacer eso. ¿Podrías por favor elaborar un poco más? ¿Qué estás exactamente probando aquí? Por lo que puedo ver es el "algo de procesamiento", el JMS de lectura/escritura o algo que envía datos a esta cosa. Gracias. –

+0

> sleep no es adecuado Necesito que las operaciones JMS sucedan en condiciones de CPU realistas. Una CPU inactiva podría darme un rendimiento JMS falsamente alto; Necesito que la CPU esté 'realísticamente' ocupada, por lo que mi medición JMS es buena. – Air

Respuesta

3

Encriptar una cadena (en al oop) llamando a Cipher.update(). Los algoritmos de cifrado son, por definición, muy difíciles de optimizar. El único problema es que hay alguna configuración no trivial que debe realizar. Estoy marcando esta respuesta como wiki de la comunidad, para que alguien que la haya escrito recientemente pueda completarla.

2

Crea una gran colección de objetos aleatorios y luego realiza llamadas alternas a Collections.shuffle() y Collections.sort().

Utilicé Jakarta Commons Lang para generar cadenas aleatorias con el propósito de mezclar/ordenar.

8

Usted podría intentar algo tan simple como

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

prueba:

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) + ")"); 
} 

Mi salida:

$ java SpinTest 
Took 500023ms (expected 500000) 

Así que el bucle no recibió optimizado de distancia (y sí, incrementó mi CPU al 100% durante ocho minutos solo para probar esto :)).

0

Crea una matriz y haz un par de manipulaciones de la matriz.

Puedes sintonizar eso bastante fácilmente variando el tamaño de la matriz.

0

Sin embargo, otro material que puede utilizar, tal vez:

 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"); 
Cuestiones relacionadas