JVM - 速度性能问题

时间:2016-03-03 20:11:47

标签: java eclipse multithreading performance jvm

鉴于下面的完整源代码,请解释为什么Eclipse中此程序的每次执行导致time中的do1()大于time do2()中的import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.IntStream; public class Question { public static void main(String[] args) { do1(); do2(); } public static void do1() { O obj = new O(); Thread t = new Thread(() -> IntStream.range(0, 100000) .forEach(e -> obj.incrementN())); long start = System.currentTimeMillis(); t.start(); try { t.join(); } catch (InterruptedException e1) { } float time = (System.currentTimeMillis()-start)/1000F; System.out.println(time); System.out.println(obj); System.out.println(); } public static void do2() { O obj = new O(); Thread t = new Thread(() -> IntStream.range(0, 100000) .forEach(e -> obj.incrementN())); long start = System.currentTimeMillis(); t.start(); try { t.join(); } catch (InterruptedException e1) { } float time = (System.currentTimeMillis()-start)/1000F; System.out.println(time); System.out.println(obj); } } class O { private AtomicInteger n = new AtomicInteger(0); public void incrementN() { n.getAndIncrement(); } @Override public String toString() { return ""+n.get(); } } 2~3毫秒。

JVM是否需要“预热”?

0.003
100000

0.001
100000

示例输出:

<?php
return [

    'default' => 'mysql',
    'connections' => [
        'mysql' => [
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'homestead',
            'username'  => 'root',
            'password'  => 'secret',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ],
        'mysql2' => [
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'homestead2',
            'username'  => 'root',
            'password'  => 'secret',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ],
    ],

1 个答案:

答案 0 :(得分:0)

这确实是一个太短的时间跨度来真正确定导致do1()执行的时间长于do2()的原因。

有些因素可能是:

  • 垃圾收集器踢(例如,创建了你的o和t对象,当方法do1()离开时,指向其内存位置(在堆栈上)的指针被销毁,但内存本身被释放垃圾收集器)

  • Eclipse在两者之间做某些分析(测量变量,时间或某些东西)

  • 正如你的建议,JVM也可以做一些预热。

  • 不幸的CPU调度。无论出于何种原因,do1()可能比do2()获得更多的CPU时间

你可以在调用do1()(或sleep)之前做一些事情,然后调用do1(),然后再次等待并调用do2()并再次测量。或者你可以增加do1()和do2()消耗的时间。

另外,你的do1()和do2()方法(除了do1()中的名称和println完全相同,那么当你只调用do1()2次时会发生什么?