CPU密集型计算的例子?

37

我需要一些容易实现的计算密集型任务和内存密集型任务,可以用Java编写,用于测试线程调度器。

它们应该稍微耗费时间,但更重要的是占用资源。

有什么建议吗?


@Martin:大家都已经知道那是 42。 - Valentin Flachsel
@Martin:听起来像是一个安全的赌注:“42+0 =?”:) 对不起,我在meursault的问题上放肆了,我太喜欢它了。我现在会停下来去地下室看看我那百万只猴子和打字机的项目。 - Valentin Flachsel
7个回答

29

几个CPU密集型任务的简单示例:

  • 查找质数(涉及大量的BigInteger除法)
  • 计算大阶乘,例如2000!(涉及大量的BigInteger乘法)
  • 许多Math.tan() 计算(这很有趣,因为Math.tan是本地的,所以你正在使用两个调用堆栈:一个用于Java调用,另一个用于C调用。)

7

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

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

计算圆周率。

旋转2D矩阵或图像。

压缩一些巨大的文件。

...


1
或者只需在N秒的for循环中将内容附加到StringBuilder中。 - tidwall
1
这将涉及大量的IO操作,因此资源消耗将比CPU密集型更加强烈。 - vikkyhacks

6

在PDP-11上进行的CPU浸泡测试是tan(atan(tan(atan(...)))等。这会很大程度地使用FPU以及堆栈和寄存器。


4

好的,这不是Java,但基于Dhrystone基准算法,可以在这里找到。这些算法的实现可能会给你一个关于如何完成它的想法。链接这里包含获取基准测试的C/C++和汇编源代码。


4
  • 计算斐波那契数列的第n项,其中n大于70。(时间消耗较高)

  • 计算大数的阶乘。(时间消耗较高)

  • 在图中找到两个节点之间的所有可能路径。(内存消耗较高)


我尝试了使用Java的BigInteger,甚至计算斐波那契数列中的第5000个数字也非常快速完成。 - Quazi Irfan
@iamcreasy,你能发布一些可行的代码来完成这个任务吗(可以在ideone上)?我很好奇它是如何如此快速地完成的。 - Rushil Paul

2
  1. RSA官方挑战
  2. 非官方RSA挑战 - 拿一些你想要用明文阅读的密文,放到计算机上进行处理。如果你使用随机算法,有一个小但是非零的成功几率。

0
我在Java中尝试了一下线程优先级,并使用了以下代码。它似乎足够占用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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接