首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

java的性能比c的高?解决思路

2012-10-17 
java的性能比c的高?昨天在实验室有人说java写的程序的速度比c写的程序的速度快,我说不可能,于是就和他打赌

java的性能比c的高?
昨天在实验室有人说java写的程序的速度比c写的程序的速度快,我说不可能,于是就和他打赌,分别写了下面这两个程序:
//c++版本
#include "windows.h"
#include <iostream>

using namespace std;

int fib(int n) {
if (n == 0 || n == 1)
return n;
  else
return fib(n - 1) + fib(n - 2);
}

int main(void)
{
long sec = GetTickCount();
for (int i = 0; i < 36; i++) {
cout<<"i="<<i<<"==>"<<fib(i)<<endl;
  }
sec = GetTickCount()-sec;
cout<<"Running Time:"<<sec<<"ms"<<endl;
return 0;
}
//java版本
package preformance;
public class Main {
  public static final int fib(int n) {
  if (n == 0 || n == 1)
  return n;
  else
  return fib(n - 1) + fib(n - 2);
  }

  public static void main(String[] args) {
   
  long sec = System.currentTimeMillis();
  for (int i = 0; i < 36; i++) {
  System.out.println("n=" + i + "=>" + fib(i));
  }
  sec=System.currentTimeMillis()-sec;
  System.out.println("Running Time:" + sec + "ms\n");
  }
}
分别运行,本以为打赌肯定赢了,没想到结果居然让我大跌眼镜——java版运行时间811毫秒,c++运行时间1362毫秒。事后,我想是不是java虚拟机采用了某种对函数调用的缓存的机制,使得想访问到fib(5)这样的函数的时候,不需要递归计算而是直接返回了fib(5)的值。由于fibonacci数列本身具有大量重叠的子问题,所以这种缓存机制正好使得程序变得像动态规划一样避免了大量子问题的计算,从而让它表面上跑的比c++的程序快了。

当然上面只是我一点不成熟的想法,我也不知道用什么办法去证实我的想法的正确性。

所以想向大家请教,有没有其他更合理的解释:为什么一个依靠虚拟机执行的语言竟然会比一个编译成机器码的语言的速度还快。或者您能帮我优化一下c++版的程序,让它在不改变算法的前提下能运行的比java版的快。谢谢了。

[解决办法]
“ 如果把Java原程序想象成我们的C++原程序,Java原程序编译后生成的字节码就相当于C++原程序编译后的80x86的机器码(二进制程序文件),JVM虚拟机相当于80x86计算机系统,Java解释器相当于80x86CPU。在80x86CPU上运行的是机器码,在Java解释器上运行的是Java字节码。

Java解释器相当于运行Java字节码的“CPU”,但该“CPU”不是通过硬件实现的,而是用软件实现的。Java解释器实际上就是特定的平台下的一个应用程序。只要实现了特定平台下的解释器程序,Java字节码就能通过解释器程序在该平台下运行,这是Java跨平台的根本。”

所以C/C++跟Java做速度比较,不能单纯的在代码上做比较,因为Java在解释过程中消耗的大量系统资源是被虚拟机占用,虚拟机才是Java的真正幕后“黑手”。

“ 每一个Java虚拟机都包含方法区(method area)和堆(heap),他们都被整个程序共享。堆栈块包含Java方法调用的状态。当一个线程调用一个方法时,Java虚拟机会将一个新的块压到Java堆栈中,当这个方法运行结束时,Java虚拟机会将对应的块弹出并抛弃。”


如果这个程序要跟Java比,就要这样写:

C/C++ code
#include <iostream>#include <windows.h>using namespace std;int temp[36];int fib(int n){        if (temp[n] != -1)        return temp[n];    if (n == 0 || n == 1)    {        temp[n]= n;    } else {        temp[n] = fib(n - 1) + fib(n - 2);    }        return temp[n];}int main(void) {    for (int i = 0; i < 36; i++)        temp[i] = -1;            long sec = GetTickCount();     for (int i = 0; i < 36; i++)    {        cout << "i=" << i << "==> " << fib(i) << "\n";     }    sec = GetTickCount()-sec;     cout << "Running Time:" << sec << "ms" << "\n"; } 

热点排行