【问题标题】:CPU Intensive Calculation Examples?CPU 密集型计算示例?
【发布时间】:2011-04-11 05:28:33
【问题描述】:

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

它们应该稍微耗时,但更重要的是消耗资源。

有什么想法吗?

【问题讨论】:

  • @Martin:每个人都知道那是 42 岁。
  • @Martin: "42+0 = ?"听起来是个不错的选择 :) 很抱歉向 meursault 的问题发送垃圾邮件,我觉得这太有趣了,无法抗拒。我现在要停下来检查我在地下室的百万只猴子和打字机项目。

标签: java multithreading cpu-usage


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      • 计算斐波那契数列的第 n 项,其中 n 大于 70。(耗时)

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

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

      【讨论】:

      • 我尝试了 Java BigInteger,甚至计算斐波那契数列中的第 5000 个数字也很快完成。
      • @iamcreasy 你能发布一些工作代码来做到这一点(也许在ideone上)?我很好奇它怎么发生得这么快。
      【解决方案4】:
      1. Official RSA Challenge
      2. 非官方 RSA 挑战 - 获取一些您想以明文形式阅读的密文。让电脑在它。如果您使用随机算法,您成功的可能性很小但非零。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

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

            计算圆周率。

            旋转二维矩阵或图像。

            压缩一些大文件。

            ...

            【讨论】:

            • 或者只是在 N 秒内的 forloop 中追加到 StringBuilder。
            • 这也会涉及大量的IO,所以资源消耗会IO密集而不是CPU密集
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-19
            • 2021-03-11
            • 1970-01-01
            • 2013-02-26
            • 2011-03-30
            相关资源
            最近更新 更多