Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ラムダ式のキャプチャとインライン展開について調べてみる
- - キャプチャ変数をラムダ式の内部から変更する場合はIntRefとして扱われる
- - 非インライン版では無名クラスが定義される。呼び出し毎にインスタンスが生成される
- - インライン展開ありでは無駄な代入が増えているが、この程度なら最適化で消えるのかもしれない
- - for(i in 1..10) ではループ比較の度にint < byte の比較を行っている
- // kotlin で書いたコード
- private fun <A,B> A.letNotInline( code: (A)->B ) :B {
- return code(this)
- }
- @Test fun testInline0(){
- var result :Int
- val n = 11
- for( i in 1..10) {
- println(n.letNotInline { v ->
- val rv = v * i
- result = rv
- rv
- })
- }
- }
- @Test fun testInline1(){
- var result :Int
- val n = 12
- for( i in 1..10) {
- println(n.let { v ->
- val rv = v * i
- result = rv
- rv
- })
- }
- }
- @Test fun testInline2(){
- var result :Int
- val n = 13
- for( i in 1..10) {
- val rv = n * i
- result = rv
- println(rv)
- }
- }
- // jadで逆コンパイルしたコード
- private final Object letNotInline(Object $receiver, Function1 code)
- {
- return code.invoke($receiver);
- }
- public final void testInline0()
- {
- kotlin.jvm.internal.Ref.IntRef result = new kotlin.jvm.internal.Ref.IntRef();
- int n = 11;
- int i = 1;
- for(byte byte0 = 11; i < byte0; i++)
- {
- int j = ((Number)letNotInline(Integer.valueOf(n), (Function1)new Function1(i, result) {
- public volatile Object invoke(Object obj)
- {
- return Integer.valueOf(invoke(((Number)obj).intValue()));
- }
- public final int invoke(int v)
- {
- int rv = v * $i;
- $result.element = rv;
- return rv;
- }
- final int $i;
- final kotlin.jvm.internal.Ref.IntRef $result;
- {
- $i = i;
- $result = intref;
- super(1);
- }
- }
- )).intValue();
- System.out.println(j);
- }
- }
- public final void testInline1()
- {
- kotlin.jvm.internal.Ref.IntRef result = new kotlin.jvm.internal.Ref.IntRef();
- int n = 12;
- int i = 1;
- for(byte byte0 = 11; i < byte0; i++)
- {
- int j = n;
- int v = j;
- int rv = v * i;
- result.element = rv;
- j = rv;
- System.out.println(j);
- }
- }
- public final void testInline2()
- {
- int n = 13;
- int i = 1;
- for(byte byte0 = 11; i < byte0; i++)
- {
- int rv = n * i;
- int result = rv;
- System.out.println(rv);
- }
- }
Add Comment
Please, Sign In to add comment