SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

連載記事

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

翔泳社では、「独習」「徹底入門」「スラスラわかる」「絵で見てわかる」「一年生」などの人気シリーズをはじめ、言語や開発手法、最新技術を解説した書籍を多数手がけています。プロジェクトマネジメントやチームビルティングといった管理職向けの書籍も豊富です。

ITエンジニアとしてのスキルアップ・リスキリングに、ぜひお役立てください。

書籍に関する記事を見る

'); googletag.cmd.push(function() { googletag.pubads().addEventListener('slotRenderEnded', function(e) { var ad_id = e.slot.getSlotElementId(); if (ad_id == 'div-gpt-ad-1659428980688-0') { var ad = $('#'+ad_id).find('iframe'); if ($(ad).width() == 728) { var ww = $(window).width(); ww = ww*0.90; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/728+","+ww/728+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/728+","+ww/728+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/728+","+ww/728+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/728+","+ww/728+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(90*ww/728)+"px;width:"+728+"px;}", 0 ); } else { if ($(window).width() < 340) { var ww = $(window).width(); ww = ww*0.875; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/320+","+ww/320+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/320+","+ww/320+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/320+","+ww/320+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/320+","+ww/320+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(180*ww/320)+"px;width:"+320+"px;}", 0 ); } } } }); }); } else { document.write('
'); document.write('
'); }
japan.internet.com翻訳記事

JavaとC++のパフォーマンスを比較する

メモリ割り当て、ループ処理、浮動小数点演算を検証

  • X ポスト
  • このエントリーをはてなブックマークに追加

 本稿では、基本的な整数演算などのテストを行いながら、JavaとC++のパフォーマンスを比較し、どちらがより速くコードを生成できるかについて説明していきます。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 Javaプログラミング言語の初期のころから、Javaはインタープリタ言語なのでパフォーマンスの点でCやC++に劣る、と主張している人たちがいました。もちろん、C++の信奉者たちは、そもそもJavaを「真の」言語だと思っていないでしょうし、Javaの連中はC++プログラマに向かっていつも「一度書けば、どこでも実行できる」と唱えています。

 まず重要なことから取り上げましょう。Javaは基本的な整数演算をどれほどうまくやってのけるでしょうか。私が誰かに「2×3は?」と尋ねたら、おそらくすぐに答が返ってくることでしょう。では、相手がプログラムならどうなるでしょうか。これを調べるために、基本的なテストを行ってみましょう。テストの内容は次のとおりです。

  1. 最初にX個のランダムな整数を生成する
  2. それらの数に、2からYまでのすべての数を掛ける
  3. 全体集合の計算に要する時間を計算する

 乱数の生成に要する時間が知りたいわけではないので、測定を始める前に乱数を生成しておくことが大事です。

Javaのテスト

 Javaでは、ごく簡単に乱数を生成できます。

private void generateRandoms()
{
   randoms = new int[N_GENERATED];
   
   for( int i = 0; i < N_GENERATED; i++)
   {
      randoms[i] = (int)(i * Math.random());
   }
}

 同様に、計算処理も簡単です。

private void javaCompute()
{
   int result = 0;
   for(int i = 2; i < N_MULTIPLY; i++)
   {
      for( int j = 0; j < N_GENERATED; j++ )
      {
         result = randoms[j] * i;
         result++;
      }
   }
}

 上記のjavaComputeメソッドの実行に要する時間を単純に測定し、それをテスト結果と見なすこともできます。しかし、これはいくつかの理由で公正ではありません。第一に、JVMはプログラムの実行中に必要に応じてクラスローダーでクラスをロードします。OS自身も、JVMから要求されるさまざまなデータ構造についての準備を行います。そのため、上記の関数を最初に実行するときは、実際には実行の準備にかなりの時間が費やされると考えられます。従って、1回のテストで時間を測定するのは不適当でしょう。

 代わりに、このプログラムを何回か実行して、結果の平均をとることにしましょう。ただし、関数の初回実行時には、実行時間の点でやはり同じ問題が生じるので、正確な時間測定ができません。その一方で、上記のメソッドの実行を繰り返すほど、JVMやOSによってデータがキャッシュされる可能性が高くなります。そのため、正確な実行時間を反映したデータではなく、OSによるコード実行最適化の結果を反映したデータが一部に含まれてしまう可能性もあり、やはり平均値の算出に影響が出ます。

 こうした問題を相殺するため、上記のメソッドを数回実行し、「最も異常な」ケース、すなわち最短時間と最長時間を除外します。そうすれば、真の平均に近い値が得られるはずです。さらに、上記のjavaComputeメソッドを実行した各時間の長さを配列に格納するものとしましょう。これは次のような単純なメソッドで実現されます。

private static long testTime( long diffs[] )
{
   long shortest = Long.MAX_VALUE;
   long longest = 0;
   long total = 0;
   for( int i = 0; i < diffs.length; i++ )
   {
      if( shortest > diffs[i] )
         shortest = diffs[i]; 
      if( longest < diffs[i] )
         longest = diffs[i];
      total += diffs[i];
   }
   total -= shortest;
   total -= longest;
   total /= ( diffs.length - 2 );
   return total;
}

 これを全部まとめると、次のコードができあがります(このコードはIntMaths.javaにも入っています)。

public static void main(String[] args) 
{
   IntMaths maths = new IntMaths();
   maths.generateRandoms();
   //compute in Java
   long timeJava[] = new long[N_ITERATIONS];
   long start, end;
   for( int i = 0; i < N_ITERATIONS; i++ )
   {
      start = System.currentTimeMillis();
      maths.javaCompute();
      end = System.currentTimeMillis();
      timeJava[i] = (end - start);
   }
   System.out.println( "Java computing took " + testTime(timeJava) );
}

 ここでは時間をミリ秒単位で測定していることに注意してください。

 筆者のラップトップ(それほどハイスペックではないものの、現在の一般的なマシンを代表するものと見てよいでしょう)で上記のコードを実行すると、平均値が約25ミリ秒になります。つまり、筆者のラップトップでは、10,000個のランダムな整数と2から1,000までの各数とを掛け合わせるのに、約25ミリ秒かかるということです。これは基本的に、約10,000,000回の整数演算に25msかかることを意味します。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
C++のテスト

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.com や EarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Liviu Tudor(Liviu Tudor)

英国在住のJavaコンサルタント。特にオンラインメディアセクタの高可用性システムに関して豊富な経験を持つ。Javaに長年取り組んでいるうちに、パフォーマンスが問題になるアプリケーションをうまく機能させるために必要なのは肥大したミドルウェアフレームワークではなく「低レベル」のコアJavaであると悟る。...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4935 2010/03/08 14:00
" ); }

おすすめ

アクセスランキング

  1. 1
    Rust 2024における構文と標準ライブラリの変更
  2. 2
    プロジェクトマネージャーなら知っておきたい、心理的安全性を生み出すチーム盛り上げプロデュース術
  3. 3
    マイクロソフト、多様な言語でWebAssemblyコンポーネントのワークロードを実行できるマイクロVM「Hyperlight Wasm」リリース
  4. 4
    ITエンジニアの採用に関わるマネジメント層、9割近くがマネジメント層の人材不足を実感 NEW
  5. 5
    ウェルスナビCTOが語る「事業成長に貢献できるエンジニアになるために必要なこと」
  1. 6
    開発生産性と技術負債の関係性は?──技術負債の「抑制」「予兆検知」「解消」に着目する
  2. 7
    ITエンジニア注目トレンドを総まとめ!週間ニュースランキングTOP10【3/21~3/27】
  3. 8
    デンソーのエンジニアファーストな人材育成プログラム ――「SOMRIE認定制度」が実現する世界
  4. 9
    生成AIの光と影、短期間で効果を生んだ企業の事例とリスクに備えるためにすべきこと NEW
  5. 10
    プルリクマージ数10倍を実現! 新卒1年目が挑戦したDevOps定着への道

アクセスランキング

  1. 1
    Rust 2024における構文と標準ライブラリの変更
  2. 2
    プロジェクトマネージャーなら知っておきたい、心理的安全性を生み出すチーム盛り上げプロデュース術
  3. 3
    マイクロソフト、多様な言語でWebAssemblyコンポーネントのワークロードを実行できるマイクロVM「Hyperlight Wasm」リリース
  4. 4
    ITエンジニアの採用に関わるマネジメント層、9割近くがマネジメント層の人材不足を実感 NEW
  5. 5
    ウェルスナビCTOが語る「事業成長に貢献できるエンジニアになるために必要なこと」
  6. 6
    開発生産性と技術負債の関係性は?──技術負債の「抑制」「予兆検知」「解消」に着目する
  7. 7
    ITエンジニア注目トレンドを総まとめ!週間ニュースランキングTOP10【3/21~3/27】
  8. 8
    デンソーのエンジニアファーストな人材育成プログラム ――「SOMRIE認定制度」が実現する世界
  9. 9
    生成AIの光と影、短期間で効果を生んだ企業の事例とリスクに備えるためにすべきこと NEW
  10. 10
    プルリクマージ数10倍を実現! 新卒1年目が挑戦したDevOps定着への道
  1. 1
    世界6000万ユーザーの「TimeTree」、サービスの未来を見据えて挑んだデータベース移行の舞台裏
  2. 2
    「オブザーバー・パターン」 ~マンガでプログラミング用語解説
  3. 3
    データサイエンス基礎を高校数学から復習しよう! D3.jsでデータを表現する
  4. 4
    macOS上のアプリケーションからChatGPTが呼び出せるように。各種IDEやターミナル、メモなどが対応
  5. 5
    プロジェクトマネージャーなら知っておきたい、心理的安全性を生み出すチーム盛り上げプロデュース術
  6. 6
    3/5まで書籍全文が無料公開 『Pythonで動かして学ぶ!Kaggleデータ分析入門』
  7. 7
    「アップサート」 ~マンガでプログラミング用語解説
  8. 8
    フロントエンドの定番ライブラリ「React 19」の新機能を紹介──React Server Componentsとその他の改善点
  9. 9
    「Tailwind CSS」の公式UIライブラリ「Tailwind UI」、サービス拡大を視野に「Tailwind Plus」へ名称変更
  10. 10
    なりたくなかったマネージャーが天職に? 知らない景色に飛び込むエンジニアは「何にだってなれる」

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

メールバックナンバー

アクセスランキング

  1. 1
    Rust 2024における構文と標準ライブラリの変更
  2. 2
    プロジェクトマネージャーなら知っておきたい、心理的安全性を生み出すチーム盛り上げプロデュース術
  3. 3
    マイクロソフト、多様な言語でWebAssemblyコンポーネントのワークロードを実行できるマイクロVM「Hyperlight Wasm」リリース
  4. 4
    ITエンジニアの採用に関わるマネジメント層、9割近くがマネジメント層の人材不足を実感 NEW
  5. 5
    ウェルスナビCTOが語る「事業成長に貢献できるエンジニアになるために必要なこと」
  1. 6
    開発生産性と技術負債の関係性は?──技術負債の「抑制」「予兆検知」「解消」に着目する
  2. 7
    ITエンジニア注目トレンドを総まとめ!週間ニュースランキングTOP10【3/21~3/27】
  3. 8
    デンソーのエンジニアファーストな人材育成プログラム ――「SOMRIE認定制度」が実現する世界
  4. 9
    生成AIの光と影、短期間で効果を生んだ企業の事例とリスクに備えるためにすべきこと NEW
  5. 10
    プルリクマージ数10倍を実現! 新卒1年目が挑戦したDevOps定着への道

アクセスランキング

  1. 1
    Rust 2024における構文と標準ライブラリの変更
  2. 2
    プロジェクトマネージャーなら知っておきたい、心理的安全性を生み出すチーム盛り上げプロデュース術
  3. 3
    マイクロソフト、多様な言語でWebAssemblyコンポーネントのワークロードを実行できるマイクロVM「Hyperlight Wasm」リリース
  4. 4
    ITエンジニアの採用に関わるマネジメント層、9割近くがマネジメント層の人材不足を実感 NEW
  5. 5
    ウェルスナビCTOが語る「事業成長に貢献できるエンジニアになるために必要なこと」
  6. 6
    開発生産性と技術負債の関係性は?──技術負債の「抑制」「予兆検知」「解消」に着目する
  7. 7
    ITエンジニア注目トレンドを総まとめ!週間ニュースランキングTOP10【3/21~3/27】
  8. 8
    デンソーのエンジニアファーストな人材育成プログラム ――「SOMRIE認定制度」が実現する世界
  9. 9
    生成AIの光と影、短期間で効果を生んだ企業の事例とリスクに備えるためにすべきこと NEW
  10. 10
    プルリクマージ数10倍を実現! 新卒1年目が挑戦したDevOps定着への道
  1. 1
    世界6000万ユーザーの「TimeTree」、サービスの未来を見据えて挑んだデータベース移行の舞台裏
  2. 2
    「オブザーバー・パターン」 ~マンガでプログラミング用語解説
  3. 3
    データサイエンス基礎を高校数学から復習しよう! D3.jsでデータを表現する
  4. 4
    macOS上のアプリケーションからChatGPTが呼び出せるように。各種IDEやターミナル、メモなどが対応
  5. 5
    プロジェクトマネージャーなら知っておきたい、心理的安全性を生み出すチーム盛り上げプロデュース術
  6. 6
    3/5まで書籍全文が無料公開 『Pythonで動かして学ぶ!Kaggleデータ分析入門』
  7. 7
    「アップサート」 ~マンガでプログラミング用語解説
  8. 8
    フロントエンドの定番ライブラリ「React 19」の新機能を紹介──React Server Componentsとその他の改善点
  9. 9
    「Tailwind CSS」の公式UIライブラリ「Tailwind UI」、サービス拡大を視野に「Tailwind Plus」へ名称変更
  10. 10
    なりたくなかったマネージャーが天職に? 知らない景色に飛び込むエンジニアは「何にだってなれる」