熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

java與C的效率相比較

2022-06-13   來源: Java核心技術 

  測試環境:CPU :iM ;內存:G; JAVA IDE:elipse ;C IDE:VCCFree

  問題一:到底是乘法效率高還是除法效率高?

  一些書籍記錄乘法效率比除法效率高比如對於浮點數m  /=  應該改寫成m  *=  於是我就做了如下的兩個測試

  C代碼:

  [cpp]

  #include <stdioh>

  #include <timeh>

  main(){

  long count = ;

  float test = ;

  int start_time end_time;

  start_time = clock();

  while(count > )

  test /= ;

  end_time = clock();

  printf( test /= 耗時%d毫秒\n (end_time start_time));

  getchar();

  }

  測試結果:平均在ms

  當我們把測試代碼test  /=  改為 test  *= 

  測試結果:平均在:ms

  符合我們的期望值

  再來看看同樣的代碼在JAVA上運行:

  [java]

  public class FuHaoCeshi {

  public static void main(String[] args){

  int count = ;

  long start_time = ;

  long end_time = ;

  float test = ;

  start_time = SystemcurrentTimeMillis();

  while(count > )

  test /= ;

  end_time = SystemcurrentTimeMillis();

  Systemoutprintln(test /= 耗時+ (end_time start_time) + ms);

  count = ;

  start_time = SystemcurrentTimeMillis();

  while(count > )

  test *=;

  end_time = SystemcurrentTimeMillis();

  Systemoutprintln(test *=耗時+ (end_time start_time) + ms);

  }

  }

  測試結果:

  test  /=  耗時ms

  test  *=  耗時ms

  結果竟然與VC測試下的結果完全相反!除法效率居然更高 !

  問題二:長整型會造成時間翻倍?

  我們把問題一JAVA程序中測試代碼改成賦值運算:

  [java]

  public class FuHaoCeshi {

  public static void main(String[] args){

  int count = ;

  long start_time = ;

  long end_time = ;

  int test = ;

  start_time = SystemcurrentTimeMillis();

  while(count > )

  test = ;

  end_time = SystemcurrentTimeMillis();

  Systemoutprintln(test = 耗時+ (end_time start_time) + ms);

  }

  }

  測試結果:

  test = 耗時ms

  接下來我們把上述程序中int count改成long count看看結果:

  測試結果:

  test = 耗時ms

  納尼!時間居然翻倍了!

  接下來用同樣的代碼用C語言測試:

  兩次結果都在ms左右無變化! 糾結!

  經xuchao 提醒把long改成double耗時為ms但改成float後發生死循環怎麼解釋?

  問題三:除法和取模運算開銷真的大嗎?

  取模是由除法實現的除法和取模的開銷比較大是大家的共識於是我把上述的測試代碼改成test %= ;

  測試結果:

  test%=耗時ms(與test = 的時間消耗一模一樣)

  而java測試結果:

  test % =耗時ms

  test = 耗時ms

  這個原因其實很好想VC做了優化把摸運算優化成了位運算於是我把test %= 改成test %= ;

  測試結果

  test %= 耗時ms驗證了我的想法(JAVA的耗時無變化貌似無優化)

  但這不是重點重點是我用CFree測試了同樣的代碼:

  [cpp]

  #include <stdioh>

  #include <timeh>

  main(){

  int count = ;

  int test = ;

  int start_time end_time;

  start_time = clock();

  while(count > )

  test %= ;

  end_time = clock();

  printf( 耗時%d毫秒\n (end_time start_time));

  getchar();

  }

  測試結果:

  test%=耗時ms

  於是我測試了 test%= 的所有質數結果一樣!!

  這編譯器怎麼優化成一樣的時間消耗?同樣的CPU裡面的加法器乘法器除法器做的都是同樣的事怎麼回事?

  下面還有幾個其他的小問題:

  對於上面的程序循環count次什麼也不做平均耗時:VC:ms;CFree:msJVM:ms

  為什麼說C是執行效率最高的高級語言JAVA由於有JVM層是執行效率慢的語言?

  經過我各方面測試JAVA最耗時的運算是test %= 上述程序達到了ms是對別的數取模耗時的倍之多;


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26780.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.