TypeProfileが取得される場合、所得されない場合について
JavaではJITコンパイルに関連するTypeProfileという機構がありますが、これがどのような状況で取得されるのかちょっと興味があったので簡単に試してみました。
komamitsu/TypeProfileTest · GitHub
Childというinterfaceを継承するChildImplA/Bという二つのclassがあり、MainXxxxというclassからChild/ChildImplA/Bの扱い方を微妙に変えて、TypeProfileが取得される挙動を見てみました。
https://github.com/komamitsu/TypeProfileTest/tree/master/org/komamitsu/tptest にMainXxxx.java群が置いてありますが概要から言うと、"あるメソッド内で、あるオブジェクトが `new` によって生成されて、そのオブジェクトが当該メソッド内のlocal変数経由で呼ばれる場合のみTypeProfileが取得されない" ように見えました。具体的には以下です。
package org.komamitsu.tptest; import org.komamitsu.tptest.child.Child; import org.komamitsu.tptest.child.ChildImplA; import org.komamitsu.tptest.child.ChildImplB; public class MainWithoutFactoryMethodAndImportingB { public static void main(String argv[]) { Child c = new ChildImplA(); for (int i = 0; i < 10000000; i++) { c.exec(); } System.out.println(c.getCount()); } }
TypeProfileTest/WithoutFactoryMethodAndImportingB at master · komamitsu/TypeProfileTest · GitHub
$ java -Xbatch -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompilation -XX:+PrintInlining org.komamitsu.tptest.MainWithoutFactoryMethodAndImportingB 62 1 b java.lang.String::hashCode (55 bytes) 72 2 b java.lang.String::indexOf (70 bytes) @ 66 java.lang.String::indexOfSupplementary (71 bytes) too big 82 3 b org.komamitsu.tptest.child.ChildImplA::exec (11 bytes) 83 4 % b org.komamitsu.tptest.MainWithoutFactoryMethodAndImportingB::main @ 10 (41 bytes) @ 17 org.komamitsu.tptest.child.ChildImplA::exec (11 bytes) inline (hot) 85 4 % org.komamitsu.tptest.MainWithoutFactoryMethodAndImportingB::main @ -2 (41 bytes) made not entrant 10000000
もうちょっと色々なケースで試してみたけれど、ひとまずはここまでで。