[ooaa main]  [object pasta2]   [essence] (旧blogはこちら)  [flickr]  [myspace]  [View Eiichi Hayashi's profile on LinkedIn] 

JVMのパフォーマンス

JavaVMはすごいですね。


http://www-06.ibm.com/jp/developerworks/java/051104/j_j-jtp09275.shtml

生のアロケーション・パフォーマンスとして速いのは、Java言語でしょうか、それともC/C++でしょうか。この答えに、多くの人は驚くでしょう。最近のJVMアロケーションは、最高パフォーマンスのmalloc実装よりも、ずっと高速なのです。HotSpot 1.4.2以降でのnew Object() 用の一般的なコード・パスは、約10マシン命令(Sun提供のデータより。参考文献を参照)ですが、Cで最高パフォーマンスのmalloc実装では、1つのコールあたり平均60から100の命令が必要です(Detlefsなどのデータによる。参考文献を参照)。

おどろいたのは、コーディング上はオブジェクトをnewして動的にメモリーを取得しているように書いてもそのメソッド呼び出しが終了されたあとにそのオブジェクトが参照されないと判断できた場合、そのオブジェクトはメソッドのスタックフレームにアロケートされると言う!
C++のメソッドのローカル変数としての変数と同じ扱いになるということです。

こんな感じです。

[C++]

class SomeClass
{
 public:
  int a;
  int b;
}

  • -

 foo()
 {
  SomeClass data; //実体がスタックフレームにできる。
  data.a = 10;
  printf( "%d", data.a );
 };

[java]

public class SomeClass
{
 public int a;
 public int b;
}

  • -

 foo()
 {
  SomeClass data = new SomeClass();
  //dataの参照が外に漏れない場合、
  //これでも、JVMの最適化ロジックによって実体がスタックフレームにできる!!
  data.a = 10;
  System.out.println( data.a );
 }