锁定老帖子 主题:我所做的Java和C++性能测试
精华帖 (2) :: 良好帖 (2) :: 新手帖 (11) :: 隐藏帖 (7)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-24
xuby 写道
怎么每个帖子说风凉话都多于认真做讨论的。
楼主辛苦些这些代码,做测试,然后贴出来跟大家分享,无论如何都是值得尊重的。至少楼主验证了在所给出的案例下,c++和Java的性能差别。 如果你认为楼主的水平很差,或者工作毫无价值,那你可以到水平高,或者比较有聊的帖子里去讨论。完全用不着去说风凉话。 现在愿意做这些貌似微不足道的测试的人,不是太多了,而是太少了。不知道这跟风凉话有没有关系。
套测试的是计算性能,不过new的消耗,对比计算性能而言是巨大的,所以不要在循环中new对象,然后再测试这样的结果更好。 |
|
返回顶楼 | |
发表时间:2011-05-24
skzr.org 写道 不过你的代码里面: public static long driveTest() { long start = System.nanoTime(); for (int j = 0; j < MAIN_C; j++) { PerformTest test = new PerformTest(); test.doTest(); test = null; } long end = System.nanoTime(); return end - start; } 还是一样的new了对象了的?不知道你这里:“在我说的条件下执行的话就不会new那么多对象出来” 是的,这就是为什么我强调“在我说的条件下”。 请参考这帖:http://rednaxelafx.iteye.com/blog/659108 昨晚发代码之前我在Linux/x64上的JDK 6 update 25用这份代码做过测试,观察了JIT编译后生成的代码,确认标量替换成功从而消除了PerformTest的创建。如果对细节有兴趣的话我可以把生成的代码贴出来。 InlineSmallCode参数是在测试的时候调整得到的值。这个值在我的环境里必须要大于1200左右才足以完成这里说的优化。为了保险我是建议设置为2000。 如果对此优化感觉很玄乎的话,可以试试自己做这个实验。由于改动后这例子创建的对象数本来就不多,所以不方便通过-verbose:gc来观察标量替换的效果。换个方式,通过jstat -gcutil来观察。 这是我在32位Windows,JDK 6 update 25上跑的一组日志: C:\x>java -server -verbose:gc -XX:+PrintCompilation -XX:InlineSmallCode=2000 -Xm x2m -Xms2m -Xmn1m PerformTest 23587 1% PerformTest::testInt @ 2 (35 bytes) 23593 2% PerformTest::testDouble @ 2 (33 bytes) 23598 1 PerformTest::testInt (35 bytes) 23598 2 PerformTest::testDouble (33 bytes) 59118 3 java.lang.Object::<init> (1 bytes) 66767 4 PerformTest::<init> (5 bytes) 66767 5 PerformTest::doTest (9 bytes) 66772 6 PerformTest::driveTest (41 bytes) 91193 3% PerformTest::driveTest @ 6 (41 bytes) start test... Program run duration: 42922.538731 ms. 虽然已经把堆设置得很小,但本来创建的对象就不多所以这个例子里看不到GC的日志。 同步收集的jstat -gcutil则是: C:\x>jps 3144 PerformTest 3896 Jps C:\x>jstat -gcutil 3144 1s S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 0.00 30.85 0.00 13.00 0 0.000 0 0.000 0.000 0.00 0.00 30.85 0.00 13.00 0 0.000 0 0.000 0.000 0.00 0.00 30.85 0.00 13.00 0 0.000 0 0.000 0.000 0.00 0.00 30.85 0.00 13.00 0 0.000 0 0.000 0.000 0.00 0.00 31.08 0.00 13.00 0 0.000 0 0.000 0.000 0.00 0.00 31.79 0.00 13.00 0 0.000 0 0.000 0.000 0.00 0.00 32.48 0.00 13.00 0 0.000 0 0.000 0.000 0.00 0.00 33.19 0.00 13.00 0 0.000 0 0.000 0.000 0.00 0.00 33.91 0.00 13.00 0 0.000 0 0.000 0.000 0.00 0.00 34.59 0.00 13.00 0 0.000 0 0.000 0.000 0.00 0.00 35.31 0.00 13.00 0 0.000 0 0.000 0.000 0.00 0.00 36.03 0.00 13.00 0 0.000 0 0.000 0.000 0.00 0.00 36.75 0.00 13.00 0 0.000 0 0.000 0.000 0.00 0.00 37.43 0.00 13.00 0 0.000 0 0.000 0.000 0.00 0.00 38.15 0.00 13.00 0 0.000 0 0.000 0.000 0.00 0.00 38.87 0.00 13.00 0 0.000 0 0.000 0.000 0.00 0.00 39.55 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 40.26 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 40.98 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 41.66 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 42.38 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 43.10 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 43.78 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 44.50 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 45.22 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 45.94 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 46.62 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 47.34 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 48.06 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 48.74 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 49.46 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 50.18 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 50.86 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 51.58 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 52.29 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 52.98 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 53.69 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 54.41 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 55.13 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 55.81 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 56.53 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 57.24 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 57.93 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 58.64 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 59.36 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 59.95 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 60.50 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 61.08 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 61.66 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 62.21 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 62.79 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 63.37 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 63.92 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 64.50 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 65.08 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 65.63 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 66.20 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 66.78 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 67.36 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 67.91 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 68.49 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 69.07 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 69.62 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 70.20 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 70.78 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 71.33 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 71.91 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 72.49 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 73.07 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 73.61 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 74.19 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 74.77 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 75.31 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 75.89 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 76.47 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 0.00 0.00 78.48 0.00 13.01 0 0.000 0 0.000 0.000 这是整个测试过程的完整日志。可以看到,经过开头一段时间后,eden的使用空间就没有再增加过;中间从76.47%到78.48%的那一条是 System.out.println("start test..."); 过程中产生的中间对象造成的,跟 driveTest() 内的代码无关。 |
|
返回顶楼 | |
发表时间:2011-05-24
貌似并不能代表一切
|
|
返回顶楼 | |
发表时间:2011-05-24
这是不是还要跟测试的环境有关系?
|
|
返回顶楼 | |
发表时间:2011-05-24
xuby 写道 怎么每个帖子说风凉话都多于认真做讨论的。
楼主辛苦些这些代码,做测试,然后贴出来跟大家分享,无论如何都是值得尊重的。至少楼主验证了在所给出的案例下,c++和Java的性能差别。 如果你认为楼主的水平很差,或者工作毫无价值,那你可以到水平高,或者比较有聊的帖子里去讨论。完全用不着去说风凉话。 现在愿意做这些貌似微不足道的测试的人,不是太多了,而是太少了。不知道这跟风凉话有没有关系。 我也没知道java比c++性能差,可是从来没有测试过。一方面c,c++只会一些基本的语法,另一方面就是懒。 谢谢 作者。 不过三倍已经超值得安慰了(对我这句话不屑一顾甚至嗤之以鼻的朋友,建议先了解他们以前效率差距多大;编译语言和解释语言效率差距多大)。 |
|
返回顶楼 | |
发表时间:2011-05-24
问下楼主,c++代码的编译选项(主要是优化选项)是什么?
|
|
返回顶楼 | |
发表时间:2011-05-24
最后修改:2011-05-24
RednaxelaFX 写道
skzr.org 写道
不过你的代码里面:
public static long driveTest() { long start = System.nanoTime(); for (int j = 0; j < MAIN_C; j++) { PerformTest test = new PerformTest(); test.doTest(); test = null; } long end = System.nanoTime(); return end - start; } 还是一样的new了对象了的?不知道你这里:“在我说的条件下执行的话就不会new那么多对象出来” 是的,这就是为什么我强调“在我说的条件下”。 请参考这帖:http://rednaxelafx.iteye.com/blog/659108 昨晚发代码之前我在Linux/x64上的JDK 6 update 25用这份代码做过测试,观察了JIT编译后生成的代码,确认标量替换成功从而消除了PerformTest的创建。如果对细节有兴趣的话我可以把生成的代码贴出来。 InlineSmallCode参数是在测试的时候调整得到的值。这个值在我的环境里必须要大于1200左右才足以完成这里说的优化。为了保险我是建议设置为2000。 如果对此优化感觉很玄乎的话,可以试试自己做这个实验。由于改动后这例子创建的对象数本来就不多,所以不方便通过-verbose:gc来观察标量替换的效果。换个方式,通过jstat -gcutil来观察。
兄弟赞叹一个,不亏来自杭州的。 看了你的参考贴确实并买了“标量替换和内联”,不过正如你所说的对此优化感觉很玄乎,这个确实让我纠结 ^ ^ 我的观点: 1. c++效率和运行速度上应该比java快 2. java在开发设计中速度比c++快
环境:ubuntu10.10 64bit, cpu: core2 P8400, jvm: jdk1.6.0_24: -server -Xms128M
不重复创建对象 vs 重复创建对象我的测试——确实差距不大。
start test[一次new]... Program run druation[一次new]: 59050.926 ms. start test [每次new]... Program run druation[每次new]: 59085.349 ms. start test[一次new]... Program run druation[一次new]: 59100.275 ms. start test [每次new]... Program run druation[每次new]: 59171.323 ms. start test[一次new]... Program run druation[一次new]: 59196.806 ms. start test [每次new]... Program run druation[每次new]: 59386.498 ms. start test[一次new]... Program run druation[一次new]: 59150.217 ms. start test [每次new]... Program run druation[每次new]: 59140.532 ms. start test[一次new]... Program run druation[一次new]: 59134.399 ms. start test [每次new]... Program run druation[每次new]: 59160.485 ms.
实际上对于java进行浮点运算有点难度,我注释了testDouble重新测试结果如下:非常好奇为什么从第3次开始速度超级快
start test[一次new]... Program run druation[一次new]: 518.487 ms. start test [每次new]... Program run druation[每次new]: 503.69 ms. start test[一次new]... Program run druation[一次new]: 469.589 ms. start test [每次new]... Program run druation[每次new]: 301.692 ms. start test[一次new]... Program run druation[一次new]: 53.419 ms. start test [每次new]... Program run druation[每次new]: 54.958 ms. start test[一次new]... Program run druation[一次new]: 54.331 ms. start test [每次new]... Program run druation[每次new]: 54.174 ms. start test[一次new]... Program run druation[一次new]: 54.417 ms. start test [每次new]... Program run druation[每次new]: 54.013 ms.
|
|
返回顶楼 | |
发表时间:2011-05-24
skzr.org 写道 实际上对于java进行浮点运算有点难度,我注释了testDouble重新测试结果如下:非常好奇为什么从第3次开始速度超级快 你测试用的具体代码和参数是怎样的呢? 这种microbenchmark的重大缺陷就是:它太小了,而且不“真实”,得到什么数据都好对实际程序来说意义都有限;更糟糕的是很小的细节可以大幅度影响这种小测试的结果数据。所以把完整的测试代码帖出来吧,想要分析里面的点的话。 多半是因为你的测试到第三次开始进入达成了标量替换的优化编译版本,而里面的testInt()变成了类似这种样子: for (int i = 0; i < INT_C; i++) ; 因为计算的结果没用过所以循环体整个消除了。要验证是不是真的如此就等楼上贴了完整测试代码再说。 可惜的是循环本身没有整个消除掉,不然效果更佳 XD |
|
返回顶楼 | |
发表时间:2011-05-24
最后修改:2011-05-24
RednaxelaFX 写道
skzr.org 写道
实际上对于java进行浮点运算有点难度,我注释了testDouble重新测试结果如下:非常好奇为什么从第3次开始速度超级快
你测试用的具体代码和参数是怎样的呢? 这种microbenchmark的重大缺陷就是:它太小了,而且不“真实”,得到什么数据都好对实际程序来说意义都有限;更糟糕的是很小的细节可以大幅度影响这种小测试的结果数据。所以把完整的测试代码帖出来吧,想要分析里面的点的话。 多半是因为你的测试到第三次开始进入达成了标量替换的优化编译版本,而里面的testInt()变成了类似这种样子: for (int i = 0; i < INT_C; i++) ; 因为计算的结果没用过所以循环体整个消除了。要验证是不是真的如此就等楼上贴了完整测试代码再说。 可惜的是循环本身没有整个消除掉,不然效果更佳 XD
刚才吃饭去了,其实就是根据lz的改了下。
public class PerformTest { public static final int INT_C = 200000; public static final int DOU_C = 50000; public static final int MAIN_C = 10000; private int m_i; private double m_d; public void testInt() { for (int i=1;i<= INT_C;i++) { m_i = (~(i*7) + 0x963 - i) & (i / 3); } } public void testDouble() { for (int i=1;i<= DOU_C;i++) { m_d = ((i<<2) + 0.36954) * Math.sin((double)i); } } public void doTest() { testInt(); //testDouble();<----------这里被注释了 } public static void main(String[] args) { main2(); main1(); main2(); main1(); main2(); main1(); main2(); main1(); main2(); main1(); } public static void main1() { PerformTest test = null; int j; System.out.println("start test [每次new]..."); long end, start = System.nanoTime(); for (j = 0;j < MAIN_C; j++) { test = new PerformTest(); test.doTest(); } end = System.nanoTime(); System.out.println("Program run druation[每次new]: " + (end - start)/1000/1000d + " ms."); } public static void main2() { PerformTest test = new PerformTest(); int j; System.out.println("start test[一次new]..."); long end, start = System.nanoTime(); for (j = 0;j < MAIN_C; j++) { test.doTest(); } end = System.nanoTime(); System.out.println("Program run druation[一次new]: " + (end - start)/1000/1000d + " ms."); } }
|
|
返回顶楼 | |
发表时间:2011-05-24
RednaxelaFX,你说得确实有道理,虽然这个jvm优化,但是确实不能带来特别的性能提升。
钦佩里的追求精神 ^ ^ |
|
返回顶楼 | |