我也写几行简单代码来看看Java的性能

大家都说,Java性能现在已经很好啦,不能再抱着老观点去看它啦,甚至也有人说,Java性能已经超越C++了。我也相信Java虚拟机在不断优化,性能有很大提高,但要说它能超越C++,我想还是有相当难度的,当然,不排除在某些特殊情况下它能超越C++。不过眼见为实,耳听为虚,不想看那些所谓权威机构的测试结果,就自己动手吧,写几行代码权当消遣。呵呵,网上已经有人贴了这类测试代码,拿来改一下,我们就简单的计算平方和然后再取模就是了。代码写完,可以跑起来看看了。哦,我们的环境是:
Windows XP Professional Service Pack 3
Intel Core2 Duo CPU T7300 @ 2.00GHz
778MHz, 2GB RAM
Visual C++ 2008 Express Edition
java version "1.6.0_10-beta"
 
运行结果(运行时间,单位为秒)
 
1st
2nd
3rd
Average
Java
1.55
1.53
1.54
1.54
C++
1.41
1.41
1.41
1.41
可以看到,对我的测试例而言,两者性能确实相差不大了,Java只比C++逊色那么一点点,对大多数应用而言,这点性能损失确实可以忽略不计了。
声明一下,测试结果严重依赖于测试用例,所以我的测试也不一定具有代表性,大家看看就好,不用太认真,:)
 
最后贴上测试用的源码:
C++代码:
#include "stdafx.h"
#include <iostream>
#include <windows.h>
 
using namespace std;
 
class TimeRecorder
{
public:
     TimeRecorder() { Start(); }
     void Start() { m_start = GetTickCount(); }
     void Stop() { m_end = GetTickCount(); }
     double GetInterval() { return (m_end - m_start)/1000.0; }
 
private:
     DWORD m_start;
     DWORD m_end;
};
 
int g_result;
double compute(int maxVal, int modNum)
{
     TimeRecorder timer;
     int result = 0;
     for (int i = 1; i < maxVal; i++)
     {
         result += i * i;
         result %= modNum;
     }
     // 有些ugly, 不过不加此句的话上面的计算过程会被完全忽略掉运行时间为0, 我也写几行简单代码来看看Java的性能
     g_result = result;
     timer.Stop();
     return timer.GetInterval();
}
 
int _tmain(int argc, _TCHAR* argv[])
{
     double time = 0.0;
 
     for (int i = 100000; i < 1000000; i += 100000)
     {
         for (int j = 100000; j < 1000000; j += 100000)
         {
              time += compute(i, j);
         }
     }
     cout << time << endl;
}
 
Java代码:
import java.util.Arrays;
 
public class GeneratePrimes
{
    public static double compute(int maxVal, int modNum)
    {
      long start = System.currentTimeMillis();
   
      int result = 0;
      for (int i = 1; i < maxVal; i++)
      {
        result += i * i;
        result %= modNum;
      }
      g_result = result;
     
      return (System.currentTimeMillis() - start)/1000.0;
    }
   
    public static void main(String args[])
    {
        double time = 0.d;
        for (int i = 100000; i < 1000000; i += 100000)
        {
          for (int j = 100000; j < 1000000; j += 100000)
          {
            time += compute(i, j);
          }
        }
 
        System.out.println(time);
    }
   
    public static int g_result;
}

本文转自Intel_ISN 51CTO博客,原文链接:http://blog.51cto.com/intelisn/130677,如需转载请自行联系原作者
上一篇:35 个 Java 代码性能优化总结(转)


下一篇:IE调试网页之七:使用探查器工具分析代码性能 (Windows)