2010-09-12 23 views
21

Necesito unos pocos cálculos de una sola CPU y de memoria que se pueden implementar fácilmente y que puedo escribir en java para un programador de hilos de prueba.Ejemplos de cálculo intensivo de CPU?

Deben consumir un poco de tiempo, pero lo que es más importante, consumen recursos.

¿Alguna idea?

+0

@Martin: todo el mundo sabe que ya es 42. –

+0

@Martin: "42 + 0 =?" suena como una buena apuesta :) Lo siento por enviar spam a la pregunta de Meursault, me pareció demasiado divertido como para resistirme. Me detendré ahora y revisaré mi proyecto de millones de monos y máquinas de escribir en el sótano. –

Respuesta

21

Algunos ejemplos fáciles de tareas intensivas de la CPU:

  • en busca de números primos (se refiere a un montón de divisiones BigInteger)
  • cálculo de factoriales grandes, por ejemplo, 2000! ((involucra muchas multiplicaciones BigInteger)
  • muchos cálculos de Math.tan() esto es interesante porque Math.tan es nativo, por lo que está utilizando dos pilas de llamadas: una para llamadas Java, la otra para llamadas C.)
6

Multiplica dos matrices. Las matrices deberían ser enormes y estar almacenadas en el disco.

Búsqueda de cadenas. O indexe un documento enorme (detecte y cuente la ocurrencia de cada palabra o cadena de alfabetos). Por ejemplo, puede indexar todos los identificadores en el código fuente de un proyecto de software grande.

Calcular pi.

Gire una matriz 2D o una imagen.

Comprima algunos archivos de gran tamaño.

...

+1

O simplemente anexar a StringBuilder en un ciclo for over más de N segundos. – tidwall

+0

esto también implicará mucho IO, por lo que el consumo de recursos será IO intenso que con CPU intensa – vikkyhacks

4

Muy bien, este no es Java, pero esto se basa en el algoritmo de referencia Dhrystone encontró here. Estas implementaciones del algoritmo pueden darle una idea de cómo se hace. El enlace here contiene fuentes para C/C++ y ensamblador para obtener los puntos de referencia.

1
  1. Official RSA Challenge
  2. no oficial RSA Challenge -.. Coge un poco de texto cifrado que desea leer en texto plano Deje que el ordenador en el que si u utilizar un algoritmo aleatorio, hay una pequeña, pero no nula posibilidad de que tendrá éxito.
6

La prueba de remojo de la CPU para el PDP-11 fue tan(atan(tan(atan(...))) etc. Funciona muy bien la FPU y también la pila y los registros.

3
  • Calcular n-ésimo término de la serie de Fibonacci, donde n es mayor que 70. (tiempo)

  • Calcular factoriales de grandes números. (consume mucho tiempo)

  • Encuentra todas las rutas posibles entre dos nodos, en un gráfico. (consume memoria)

+0

Probé con Java BigInteger e incluso el cálculo del número 5000 en la serie Fibonacci se realizó muy rápidamente. –

+0

@iamcreasy ¿Puedes publicar algún código de trabajo para hacer eso (en ideone quizás)? Tengo curiosidad de cómo sucedió tan rápido. – Rushil

+0

Claro, [aquí] (http://pastebin.com/RaqQ9rwm). Avísame si cometí un error. –

0

Estaba jugando con la prioridad de subprocesos en Java y usé el código siguiente. Parece mantener la CPU lo suficientemente ocupada como para que la prioridad de la secuencia haga la diferencia.

@Test 
public void testCreateMultipleThreadsWithDifferentPriorities() throws Exception { 
    class MyRunnable implements Runnable { 
     @Override 
     public void run() { 
      for (int i=0; i<1_000_000; i++) { 
       double d = tan(atan(tan(atan(tan(atan(tan(atan(tan(atan(123456789.123456789)))))))))); 
       cbrt(d); 
      } 
      LOGGER.debug("I am {}, and I have finished", Thread.currentThread().getName()); 
     } 
    } 
    final int NUMBER_OF_THREADS = 32; 
    List<Thread> threadList = new ArrayList<Thread>(NUMBER_OF_THREADS); 
    for (int i=1; i<=NUMBER_OF_THREADS; i++) { 
     Thread t = new Thread(new MyRunnable()); 
     if (i == NUMBER_OF_THREADS) { 
      // Last thread gets MAX_PRIORITY 
      t.setPriority(Thread.MAX_PRIORITY); 
      t.setName("T-" + i + "-MAX_PRIORITY"); 
     } else { 
      // All other threads get MIN_PRIORITY 
      t.setPriority(Thread.MIN_PRIORITY); 
      t.setName("T-" + i); 
     } 
     threadList.add(t); 
    } 

    threadList.forEach(t->t.start()); 
    for (Thread t : threadList) { 
     t.join(); 
    } 
} 
Cuestiones relacionadas