2017-06-05 16 views
-4

バブルソート機能を実行して未分類のレコード100000個をソートすると、C#またはJavaの方が速いかどうかチェックしたいと思っていました。 C#の場合Javaは、バブルソートでC#よりも実際に高速ですか?

は、私はバブルソートのためにこのコードを使用:Java用

 static void sort(int[] table) 
    { 
     int n = table.Length; 
     do 
     { 
      for (int i = 0; i < n - 1; i++) 
      { 
       if (table[i] > table[i + 1]) 
       { 
        int tmp = table[i]; 
        table[i] = table[i + 1]; 
        table[i + 1] = tmp; 
       } 
      } 
      n--; 
     } 
     while (n > 1); 
    } 

、それはほとんど同じです:

static void sort(int[] table) 
    { 
     int n = table.length; 
     do 
     { 
      for (int i = 0; i < n - 1; i++) 
      { 
       if (table[i] > table[i + 1]) 
       { 
        int tmp = table[i]; 
        table[i] = table[i + 1]; 
        table[i + 1] = tmp; 
       } 
      } 
      n--; 
     } 
     while (n > 1); 
    } 

実行時間を測定するために、C#で、私はStopwatchクラス使用:

Stopwatch sw = new Stopwatch(); 
      sw.Start(); 
      sort(arr); 
      sw.Stop(); 

JavaでStopwatchクラスが見つかりませんでした。このコードを使用してexecutioを測定しましたJavaでn時間:

class ExecutionTimer { 
    private long start; 
    private long end; 

    public ExecutionTimer() { 
    start = System.nanoTime(); 
    } 

    public void end() { 
    end = System.nanoTime(); 
    } 

    public float duration(){ 
    return (end-start); 
    } 

    public void reset() { 
    start = 0; 
    end = 0; 
    }} 

私はアルゴリズムをC#で5回、Javaで5回実行します。 C#での実行時間の平均時間は、40,13sであり、Javaでは18,44sでした。

なぜ違いが大きいのですか? C#で時間を測定するためにStopWatchを使用したからですか? テスト中にノートパソコンのすべてのプログラム、ブラウザ、ウイルス対策ソフトを終了しました。

ありがとうございます。

+0

デバッガを接続してC#バージョンを実行しましたか? – harold

+0

リリースモードでC#コードをコンパイルしましたか? – cHao

+0

私はそれをデバッグモードで実行します。 – ElPolako

答えて

3

C#がJavaよりも遅く実行されても、私は驚くことはありませんが、テスト方法がうまくいきませんので、ここでの違いは非常に大きいです。

クロックの読み込みの間にベンチマークされるコードを呼び出すことはできません。最初にコードを何度も実行することによって、コードをジットすることができなければなりません。ベンチマークサークルでは、これは "ウォームアップ"と呼ばれ、バイトコード(または場合によってはMSIL)にコンパイルされ、実行時にジャストインタイムコンパイルされる言語には必要です。

ウォームアップには何回かかりますか?意見は異なります。私はあなたが一度それを実行する必要があると聞いている、私はあなたが10000回それを実行する必要があります聞いたことがある。あなたが得るものを試してみてください。

+0

*「Jitted」* - ちょうど時間コンパイル/解釈 – CraigR8806

+0

なぜ「ウォームアップ」しなければならないのですか?私はC#コードとJavaコードを同じ条件で実行します - 「ウォームアップ」なしで、同じPCに、バックグラウンドプロセスはありません。それで、私のために、Javaはより速くコンパイルするために温暖化を必要としないので、より高速です。 – ElPolako

+1

ジャストインタイムコンパイルは、制御できない膨大な変数であるため、測定時間に影響を与えたくありません。それ以外のものでなければ、より遅いジッタはより速いコードを生成するので遅くなる可能性があるため、ジッタのオーバーヘッドと一緒に測定した場合、より高速なコードに不利なペナルティが課されるためです。 –

関連する問題