1

「Cは速い、Javaは遅い」でしょ?

Video2BrainのObjectiv-C3.0チュートリアルのタイムテーブルの例を、a)  Eclipse / Javaとb) MacBookProQuadcore上のXCode/Objectiv-Cで比較しました。その結果は私を絶対に驚かせました。JavaはObjective-Cの実装より3倍高速です。Java:Objective-Cと比較して0.718秒:2.416秒。

質問:何が恋しいですか?これはどのように説明できますか?ありがとう!

a)Javaコード:

public static void main(String[] args) {

int timesTable[][] = new int[10][10];
long beginTime = System.currentTimeMillis();

// 10 000 000 x
for (int count = 0; count < 10000000; count++) {
   for (int row = 0; row < 10; row++) {
      for (int col = 0; col < 10; col++) {
         timesTable[row][col] = (row +1) * (col +1);
      }
   }
 }
 long endTime = System.currentTimeMillis();
 System.out.println("Time elapsed = " + (endTime - beginTime) + "ms");
 }

b)Objective-Cコード

int main(int argc, char* argv[]) {
int timesTable[10][10];

CFAbsoluteTime beginTime = CFAbsoluteTimeGetCurrent();

 // 10 000 000 x
for (int count = 0; count < 10000000; count++) {
  for (int row = 0; row < 10; row++) {
    for (int col = 0; col < 10; col++) {
       timesTable[row][col] = (row +1) * (col +1);
    }
  }
}
 CFAbsoluteTime endTime = CFAbsoluteTimeGetCurrent();
 NSLog(@"Time elapsed = %f", endTime - beginTime);
}

アップデート

@nhahtdhコンパイラオプション:コンパイラ:AppleLLVMコンパイラ4.2

@jlordo:timesTable [row] [column] =(row +1)*(column +1)* countに変更すると、同じ結果が得られます

@uchuugaka:そうですね、Javaと比較して基本的にCに同意します。私は両方とも5回テストを実行します。システムが再起動しました。他のアプリケーションは実行されていません。

@Anoop Vaidya:はい、最新バージョンです。同じ時間を取得します。LLVMGCC4.2またはAppleLLVMコンパイラ4.2に違いはありません。

UPDATE2

@justin:ありがとう、問題は解決しました。ビルド設定->最適化レベル

4

2 に答える 2

10

あなたの「ベンチマーク」には欠陥があります。C オプティマイザー (ObjC テスト用) は、ループ全体を削除できることを認識する必要があります。速度の比較は、最適化を有効にして実行する必要があります (例: -O3)。最適化を有効にしてテストを実行すると、上記のプログラムの経過時間は 0.0 秒です (はい、テストして確認しました)。

より良いベンチマークを考案する必要があります。

于 2013-03-07T13:33:49.423 に答える
5

おそらくそれは不正確なベンチマークです。

これを読む:

Javaで正しいマイクロベンチマークを作成するにはどうすればよいですか?

于 2013-03-07T13:27:06.453 に答える