大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > Java技巧 > java与C的效率相比较

java与C的效率相比较

关键词:Javajava与C的效率相比较  阅读(785) 赞(16)

[摘要]本文主要是对java与C的效率相比较的讲解,希望对大家学习java与C的效率相比较有所帮助。

  测试环境:CPU :i3-370M ;内存:4G; JAVA IDE:elipse ;C IDE:VC6.0,C-Free5.0.

  问题一:到底是乘法效率高,还是除法效率高?

  一些书籍记录乘法效率比除法效率高,比如对于浮点数m  /=  2 应该改写成m  *=  0.5于是我就做了如下的两个测试

  C代码:

  [cpp]

  #include <stdio.h>

  #include <time.h>

  main(){

  long count = 100000000;

  float test = 1;

  int start_time, end_time;

  start_time = clock();

  while(--count > 0)

  test /= 2;

  end_time = clock();

  printf( “test /= 2耗时%d毫秒\n”, (end_time - start_time));

  getchar();

  }

  测试结果:平均在600ms

  当我们把测试代码test  /=  2 改为 test  *=  0.5时

  测试结果:平均在:520ms

  符合我们的期望值

  再来看看同样的代码在JAVA上运行:

  [java]

  public class FuHaoCeshi {

  public static void main(String[] args){

  int count = 100000000;

  long start_time = 0;

  long end_time = 0;

  float test = 1;

  start_time = System.currentTimeMillis();

  while(--count > 0)

  test /= 2;

  end_time = System.currentTimeMillis();

  System.out.println(“test /= 2耗时”+ (end_time - start_time) + “ms”);

  count = 100000000;

  start_time = System.currentTimeMillis();

  while(--count > 0)

  test *=0.5;

  end_time = System.currentTimeMillis();

  System.out.println(“test *=0.5耗时”+ (end_time - start_time) + “ms”);

  }

  }

  测试结果:

  test  /=  2耗时300ms

  test  *=  0.5耗时468ms

  结果竟然与VC测试下的结果完全相反!除法效率居然更高- -!

  问题二:长整型会造成时间翻倍?

  我们把问题一JAVA程序中测试代码改成赋值运算:

  [java]

  public class FuHaoCeshi {

  public static void main(String[] args){

  int count = 100000000;

  long start_time = 0;

  long end_time = 0;

  int test = 1;

  start_time = System.currentTimeMillis();

  while(--count > 0)

  test = 1;

  end_time = System.currentTimeMillis();

  System.out.println(“test = 1耗时”+ (end_time - start_time) + “ms”);

  }

  }

 

  测试结果:

  test = 1耗时86ms

  接下来我们把上述程序中int count改成long count看看结果:

  测试结果:

  test = 1耗时172ms

  纳尼!时间居然翻倍了!

  接下来用同样的代码用C语言测试:

  两次结果都在350ms左右,无变化! 纠结!

  经xuchao1229 提醒,把long改成double耗时为170ms,但改成float后发生死循环,怎么解释?

  问题三:除法和取模运算开销真的大吗?

  取模是由除法实现的,除法和取模的开销比较大是大家的共识.于是我把上述的测试代码改成test %= 2;

  测试结果:

  test%=2耗时300ms.(与test = 1的时间消耗一模一样.)

  而java测试结果:

  test % =2耗时1084ms

  test = 1耗时86ms

  这个原因其实很好想,VC6.0做了优化把摸2运算优化成了位运算,于是我把test %= 2改成test %= 3;

  测试结果

  test %= 3耗时1164ms,验证了我的想法.(JAVA的耗时无变化,貌似无优化)

  但这不是重点,重点是我用C-Free测试了同样的代码:

  [cpp]

  #include <stdio.h>

  #include <time.h>

  main(){

  int count = 100000000;

  int test = 1;

  int start_time, end_time;

  start_time = clock();

  while(--count > 0)

  test %= 3;

  end_time = clock();

  printf( “耗时%d毫秒\n”, (end_time - start_time));

  getchar();

  }

  测试结果:

  test%=3耗时92ms

  于是我测试了 test%= 7,...31,的所有质数,结果一样!!

  这编译器怎么优化成一样的时间消耗?同样的CPU,里面的加法器,乘法器,除法器做的都是同样的事,怎么回事?

  下面还有几个其他的小问题:

  4.对于上面的程序循环count次什么也不做平均耗时:VC:320ms;C-Free:92ms,JVM:85ms,

  为什么说C是执行效率最高的高级语言,JAVA由于有JVM层是执行效率慢的语言?

  5.经过我各方面测试JAVA最耗时的运算是test %= 1,上述程序达到了3000ms,是对别的数取模耗时的3倍之多;



相关评论