【问题标题】:generate CPU load in Java在 Java 中生成 CPU 负载
【发布时间】:2010-09-27 18:46:24
【问题描述】:

我正在进行一些吞吐量测试。我的应用程序必须

  1. 从 JMS 读取
  2. 做一些处理
  3. 写入 JMS

我的目标是模拟#2,“一些处理”。也就是说,在转发事件之前引入延迟并占用 CPU 一段给定的时间(例如 500 毫秒)。

天真的方法是Thread.sleep(500)。这会在执行中引入正确的延迟,但不会占用 CPU。

计算斐波那契数是一种选择。 有没有人使用任何有趣的技术来让 CPU 在给定的时间内保持忙碌?

理想的特征是:

  • 执行各种指令,而不是(例如)只是循环旋转
  • HotSpot VM 不会优化到什么都没有
  • 有一种简单的方法可以向上或向下调整处理周期(完成时间会因硬件而明显不同)

【问题讨论】:

  • 你能进一步解释为什么使用 CPU 是必要的,但简单地用 Thread.sleep() 睡觉是不合适的吗?
  • 我不确定我理解你所说的“锻炼 CPU”是什么意思,以及为什么你需要这样做。你能详细说明一下吗?你到底在这里测试什么?据我所知,它要么是“一些处理”,要么是读/写 JMS,要么是向这个东西发送数据的东西。谢谢。
  • > sleep 不适合我需要 JMS 操作在实际 CPU 条件下发生。空闲的 CPU 可能会给我带来虚假的高 JMS 性能;我需要 CPU “实际”地忙碌,这样我的 JMS 测量结果才好。

标签: java encryption load cpu


【解决方案1】:

通过调用 Cipher.update() 加密字符串(在循环中)。根据定义,加密算法很难优化。唯一的问题是您需要执行一些重要的设置。我将此答案标记为社区 wiki,以便最近编写它的人可以填写。

【讨论】:

    【解决方案2】:

    创建一个非常大的随机对象集合,然后交替调用Collections.shuffle()Collections.sort()

    我使用 Jakarta Commons Lang 生成随机字符串以进行洗牌/排序。

    【讨论】:

      【解决方案3】:

      你可以尝试一些简单的东西,比如

      private static void spin(int milliseconds) {
          long sleepTime = milliseconds*1000000L; // convert to nanoseconds
          long startTime = System.nanoTime();
          while ((System.nanoTime() - startTime) < sleepTime) {}
      }
      

      测试:

      public static void main(String[] args) {
          final int NUM_TESTS = 1000;
          long start = System.nanoTime();
          for (int i = 0; i < NUM_TESTS; i++) {
              spin(500);
          }
          System.out.println("Took " + (System.nanoTime()-start)/1000000 +
              "ms (expected " + (NUM_TESTS*500) + ")");
      }
      

      我的输出:

      $ java SpinTest
      Took 500023ms (expected 500000)
      

      所以循环并没有得到优化(是的,我将 CPU 提高到 100% 八分钟只是为了测试这个 :))。

      【讨论】:

      • 这将一直有效,直到下一个版本的 HotSpot 对其进行优化...
      【解决方案4】:

      创建一个矩阵并进行一些矩阵操作。

      您可以通过改变矩阵的大小来轻松调整它。

      【讨论】:

        【解决方案5】:

        还有一些你可以使用的东西,也许:

                long start  = System.currentTimeMillis();
                long count = 0l;
                for(long x=0;x<Integer.MAX_VALUE ;x++){
                    count+=1;
                }
                long end = System.currentTimeMillis();
                System.out.println(end-start +" ms");
        

        【讨论】:

          猜你喜欢
          • 2011-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多