Ejemplos de cálculos intensivos de CPU

Necesito unos cuantos cálculos simples de CPU y memoria fáciles de implementar que puedo escribir en java para un progtwigdor de hilos de prueba.

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

¿Algunas ideas?

Algunos ejemplos fáciles de tareas intensivas de CPU:

  • buscando números primos (involucra muchas divisiones de BigInteger)
  • calcular factoriales grandes, por ejemplo 2000! ((implica muchas multiplicaciones de BigInteger)
  • muchos cálculos de Math.tan (). Esto es interesante porque Math.tan es nativo, por lo que está utilizando dos stacks de llamadas: una para llamadas Java, la otra para llamadas C.

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.

Calcula pi.

Gire una matriz 2D o una imagen.

Comprime algunos archivos enormes

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

Ok, esto no es Java, pero está basado en el algoritmo de referencia de Dhrystone que se encuentra aquí . Estas implementaciones del algoritmo pueden darle una idea de cómo se hace. El enlace aquí contiene fonts para C / C ++ y Assembler para obtener los puntos de referencia.

  • Calcular el enésimo término de la serie de fibonacci, donde n es mayor que 70. (tiempo que consume)

  • Calcular factoriales de grandes números. (pérdida de tiempo)

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

  1. Desafío oficial RSA
  2. Reto de RSA no oficial: toma un texto cifrado que quieras leer en texto sin formato. Deje que la computadora en eso. Si usas un algoritmo aleatorizado, hay una posibilidad pequeña pero no cero de que tengas éxito.

Estuve jugando con la prioridad de subprocesos en Java y usé el código a continuación. 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 threadList = new ArrayList(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(); } } 
Intereting Posts