ここでJavaがCよりも高速に実行されるのはなぜですか?

OscarRyz:

この質問触発され

現在、1万人を超えるユーザーにのみ表示されます

私は次のコードを思いつきました:

$cat loop.c 
int main( int argc, char ** argv ) 
{
    int i = 0;
    while( i++ < 2147483647 );
}

$cc -o loop loop.c  

$ time ./loop
real 0m11.161s
user 0m10.393s
sys 0m0.012s


$cat Loop.java 
class Loop {
    public static void main( String [] args ) { 
        int i = 0;
        while( i++ < 2147483647 );
    }
}

$javac Loop.java 

$time java  Loop  
real 0m4.578s
user 0m3.980s
sys 0m0.048s

JavaバージョンはCバージョンのほぼ3倍の速度で動作するのはなぜですか?ここで何が欠けていますか?

これは、Ubuntu 9.04で実行されます。

インテル(R)Pentium(R)M @ 1.73GHz

32ビット

編集する

これは素晴らしいです。Cで-O3オプションを使用するとループが最適化され、Javaで-serverを使用すると同じことが行われます。これは「最適化された時間」です。最適化

カールノルム:

私は期待してjavacあなたのCコンパイラよりも最適化のいくつかのより高いレベルをデフォルトされます。-O3ここでコンパイルすると、Cの方がはるかに高速です。

C with -O3

real    0m0.003s
user    0m0.000s
sys     0m0.002s

あなたのJavaプログラム:

real    0m0.294s
user    0m0.269s
sys     0m0.051s

もう少し詳細; 最適化なしでは、Cは次のようにコンパイルされます。

0000000100000f18 pushq %rbp
0000000100000f19 movq %rsp,%rbp
0000000100000f1c movl %edi,0xec(%rbp)
0000000100000f1f movq %rsi,0xe0(%rbp)
0000000100000f23 movl $0x00000000,0xfc(%rbp)
0000000100000f2a incl 0xfc(%rbp)
0000000100000f2d movl $0x80000000,%eax
0000000100000f32 cmpl %eax,0xfc(%rbp)
0000000100000f35 jne  0x00000f2a
0000000100000f37 movl $0x00000000,%eax
0000000100000f3c leave
0000000100000f3d ret

最適化(-O3)を使用すると、次のようになります。

0000000100000f30 pushq %rbp
0000000100000f31 movq %rsp,%rbp
0000000100000f34 xorl %eax,%eax
0000000100000f36 leave
0000000100000f37 ret

ご覧のとおり、ループ全体が削除されています。javap -c Loop私にJavaバイトコードのこの出力を与えました:

public static void main(java.lang.String[]);
  Code:
   0:   iconst_0
   1:   istore_1
   2:   iload_1
   3:   iinc    1, 1
   6:   ldc #2; //int 2147483647
   8:   if_icmpge   14
   11:  goto    2
   14:  return

}

ループがコンパイルされているようですが、実行時に何かが発生してスピードアップしています。(他の人が述べたように、JITコンパイラーはループを押しつぶします。)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

この操作がGPUよりもCPUで高速に実行されるのはなぜですか?

分類Dev

このコードでCPUがGPUよりも高速に実行されるのはなぜですか?

分類Dev

C#がC ++よりも高速に実行されるのはなぜですか?

分類Dev

test1()がtest2()よりもはるかに高速に実行されるのはなぜですか?

分類Dev

コードのこの部分が他の部分よりも先に実行されるのはなぜですか?

分類Dev

ストリームを使用するこのコードがJava 9でJava 8よりもはるかに高速に実行されるのはなぜですか?

分類Dev

scipy線形補間が最近隣補間よりも高速に実行されるのはなぜですか?

分類Dev

PythonのこのコードがC ++よりもはるかに高速なのはなぜですか?

分類Dev

この単純なループの実行において、PHP7がPython3よりもはるかに高速なのはなぜですか?

分類Dev

Futureを使用したこの例は、ベンチマークよりも高速に実行されないのはなぜですか?

分類Dev

この場合、PythonがC ++よりも高速なのはなぜですか?

分類Dev

PythonはC ++よりも大幅に高速に実行されていますか?ここで何かがおかしいようです

分類Dev

char c = 7; この文がJavaでエラーなしに実行されるのはなぜですか?

分類Dev

collections.Counterがソースコードを直接実行するよりも高速に実行されるのはなぜですか

分類Dev

この場合、「sed」が「awk」よりもはるかに高速でないのはなぜですか

分類Dev

EclipseのPyDevPythonコンソールよりもEclipseコンソールの方がコードが高速に実行されるのはなぜですか?

分類Dev

Python印刷がGoのfmt.Printおよびos.Stdout.Writeよりも高速に実行されるのはなぜですか

分類Dev

バイトコードがネイティブコードよりも高速に実行される可能性があるのはなぜですか

分類Dev

代わりに、CPUがGPUよりも高速に行列演算を実行するのはなぜですか?

分類Dev

n-body プログラムのこの特定の C++ 実装が Java バージョンよりも高速なのはなぜですか?

分類Dev

GPUがCPUよりも高速に行列乗算を実行できるのはなぜですか?

分類Dev

Pythonがmain()関数を介して独自の関数を実行するC ++よりも高速にC ++関数を実行するのはなぜですか?

分類Dev

setImmediate()がシーケンシャルコードよりも高速に実行されるのはなぜですか?

分類Dev

何も起こらずにPythonSlackアプリが永久に実行されるのはなぜですか?

分類Dev

C#:これは、インラインコードよりも、複数の関数でどのように高速に実行されますか?

分類Dev

コードが想定よりもはるかに多く実行されるのはなぜですか?

分類Dev

スケジュールされたタスクをCeleryで実行することがcrontabよりも望ましいのはなぜですか?

分類Dev

スケジュールされたタスクをCeleryで実行することがcrontabよりも望ましいのはなぜですか?

分類Dev

なぜC ++の構造体はCよりも多くのことを実行できるのですか?

Related 関連記事

  1. 1

    この操作がGPUよりもCPUで高速に実行されるのはなぜですか?

  2. 2

    このコードでCPUがGPUよりも高速に実行されるのはなぜですか?

  3. 3

    C#がC ++よりも高速に実行されるのはなぜですか?

  4. 4

    test1()がtest2()よりもはるかに高速に実行されるのはなぜですか?

  5. 5

    コードのこの部分が他の部分よりも先に実行されるのはなぜですか?

  6. 6

    ストリームを使用するこのコードがJava 9でJava 8よりもはるかに高速に実行されるのはなぜですか?

  7. 7

    scipy線形補間が最近隣補間よりも高速に実行されるのはなぜですか?

  8. 8

    PythonのこのコードがC ++よりもはるかに高速なのはなぜですか?

  9. 9

    この単純なループの実行において、PHP7がPython3よりもはるかに高速なのはなぜですか?

  10. 10

    Futureを使用したこの例は、ベンチマークよりも高速に実行されないのはなぜですか?

  11. 11

    この場合、PythonがC ++よりも高速なのはなぜですか?

  12. 12

    PythonはC ++よりも大幅に高速に実行されていますか?ここで何かがおかしいようです

  13. 13

    char c = 7; この文がJavaでエラーなしに実行されるのはなぜですか?

  14. 14

    collections.Counterがソースコードを直接実行するよりも高速に実行されるのはなぜですか

  15. 15

    この場合、「sed」が「awk」よりもはるかに高速でないのはなぜですか

  16. 16

    EclipseのPyDevPythonコンソールよりもEclipseコンソールの方がコードが高速に実行されるのはなぜですか?

  17. 17

    Python印刷がGoのfmt.Printおよびos.Stdout.Writeよりも高速に実行されるのはなぜですか

  18. 18

    バイトコードがネイティブコードよりも高速に実行される可能性があるのはなぜですか

  19. 19

    代わりに、CPUがGPUよりも高速に行列演算を実行するのはなぜですか?

  20. 20

    n-body プログラムのこの特定の C++ 実装が Java バージョンよりも高速なのはなぜですか?

  21. 21

    GPUがCPUよりも高速に行列乗算を実行できるのはなぜですか?

  22. 22

    Pythonがmain()関数を介して独自の関数を実行するC ++よりも高速にC ++関数を実行するのはなぜですか?

  23. 23

    setImmediate()がシーケンシャルコードよりも高速に実行されるのはなぜですか?

  24. 24

    何も起こらずにPythonSlackアプリが永久に実行されるのはなぜですか?

  25. 25

    C#:これは、インラインコードよりも、複数の関数でどのように高速に実行されますか?

  26. 26

    コードが想定よりもはるかに多く実行されるのはなぜですか?

  27. 27

    スケジュールされたタスクをCeleryで実行することがcrontabよりも望ましいのはなぜですか?

  28. 28

    スケジュールされたタスクをCeleryで実行することがcrontabよりも望ましいのはなぜですか?

  29. 29

    なぜC ++の構造体はCよりも多くのことを実行できるのですか?

ホットタグ

アーカイブ