天天看点

我也写几行简单代码来看看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

C++

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, 

     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,如需转载请自行联系原作者