CPU密集计算示例?

时间:2010-09-12 00:03:43

标签: java multithreading cpu-usage

我需要一些易于实现的单个cpu和内存密集型计算,我可以在java中为测试线程调度程序编写。

它们应该耗费一些时间,但更重要的是消耗资源。

有什么想法吗?

7 个答案:

答案 0 :(得分:23)

CPU密集型任务的一些简单示例:

  • 搜索素数(涉及大量BigInteger部门)
  • 计算大因子,例如2000! ((涉及大量BigInteger乘法)
  • 很多Math.tan()计算(这很有趣,因为Math.tan是原生的,所以你使用两个调用堆栈:一个用于Java调用,另一个用于C调用。)

答案 1 :(得分:6)

将两个矩阵相乘。矩阵应该很大并存储在磁盘上。

字符串搜索。或者,索引一个巨大的文档(检测并计算每个单词或字母串的出现)例如,您可以索引大型软件项目的源代码中的所有标识符。

计算pi。

旋转2D矩阵或图像。

压缩一些大文件。

...

答案 2 :(得分:6)

PDP-11的CPU浸泡测试是tan(atan(tan(atan(...)))等。非常努力地工作FPU以及堆栈和寄存器。

答案 3 :(得分:4)

好的,这不是Java,但这是基于找到的Dhrystone基准算法here。算法的这些实现可能会让您了解它是如何完成的。链接here包含C / C ++和汇编程序的源,以获取基准。

答案 4 :(得分:3)

  • 计算斐波那契数列的第n项,其中n大于70.(耗时)

  • 计算大数的阶乘。 (耗费时间)

  • 找到所有可能的 两个节点之间的路径,在图中。 (记忆消耗)

答案 5 :(得分:1)

  1. Official RSA Challenge
  2. 非官方RSA挑战 - 获取您想要以纯文本阅读的密文。让电脑就可以了。如果你使用随机算法,那么你将有一个很小但非零的机会成功。

答案 6 :(得分:0)

我在Java中使用Thread优先级并使用下面的代码。它似乎让CPU足够繁忙,线程优先级有所不同。

@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();
    }
}