Guest User

Untitled

a guest
Jan 16th, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.84 KB | None | 0 0
  1. ラムダ式のキャプチャとインライン展開について調べてみる
  2.  
  3. - キャプチャ変数をラムダ式の内部から変更する場合はIntRefとして扱われる
  4. - 非インライン版では無名クラスが定義される。呼び出し毎にインスタンスが生成される
  5. - インライン展開ありでは無駄な代入が増えているが、この程度なら最適化で消えるのかもしれない
  6. - for(i in 1..10) ではループ比較の度にint < byte の比較を行っている
  7.  
  8.  
  9. // kotlin で書いたコード
  10.  
  11. private fun <A,B> A.letNotInline( code: (A)->B ) :B {
  12. return code(this)
  13. }
  14.  
  15. @Test fun testInline0(){
  16. var result :Int
  17. val n = 11
  18. for( i in 1..10) {
  19. println(n.letNotInline { v ->
  20. val rv = v * i
  21. result = rv
  22. rv
  23. })
  24. }
  25. }
  26.  
  27. @Test fun testInline1(){
  28. var result :Int
  29. val n = 12
  30. for( i in 1..10) {
  31. println(n.let { v ->
  32. val rv = v * i
  33. result = rv
  34. rv
  35. })
  36. }
  37. }
  38.  
  39. @Test fun testInline2(){
  40. var result :Int
  41. val n = 13
  42. for( i in 1..10) {
  43. val rv = n * i
  44. result = rv
  45. println(rv)
  46. }
  47. }
  48.  
  49.  
  50. // jadで逆コンパイルしたコード
  51.  
  52.  
  53. private final Object letNotInline(Object $receiver, Function1 code)
  54. {
  55. return code.invoke($receiver);
  56. }
  57.  
  58. public final void testInline0()
  59. {
  60. kotlin.jvm.internal.Ref.IntRef result = new kotlin.jvm.internal.Ref.IntRef();
  61. int n = 11;
  62. int i = 1;
  63. for(byte byte0 = 11; i < byte0; i++)
  64. {
  65. int j = ((Number)letNotInline(Integer.valueOf(n), (Function1)new Function1(i, result) {
  66.  
  67. public volatile Object invoke(Object obj)
  68. {
  69. return Integer.valueOf(invoke(((Number)obj).intValue()));
  70. }
  71.  
  72. public final int invoke(int v)
  73. {
  74. int rv = v * $i;
  75. $result.element = rv;
  76. return rv;
  77. }
  78.  
  79. final int $i;
  80. final kotlin.jvm.internal.Ref.IntRef $result;
  81.  
  82.  
  83. {
  84. $i = i;
  85. $result = intref;
  86. super(1);
  87. }
  88. }
  89. )).intValue();
  90. System.out.println(j);
  91. }
  92.  
  93. }
  94.  
  95. public final void testInline1()
  96. {
  97. kotlin.jvm.internal.Ref.IntRef result = new kotlin.jvm.internal.Ref.IntRef();
  98. int n = 12;
  99. int i = 1;
  100. for(byte byte0 = 11; i < byte0; i++)
  101. {
  102. int j = n;
  103. int v = j;
  104. int rv = v * i;
  105. result.element = rv;
  106. j = rv;
  107. System.out.println(j);
  108. }
  109.  
  110. }
  111.  
  112. public final void testInline2()
  113. {
  114. int n = 13;
  115. int i = 1;
  116. for(byte byte0 = 11; i < byte0; i++)
  117. {
  118. int rv = n * i;
  119. int result = rv;
  120. System.out.println(rv);
  121. }
  122.  
  123. }
Add Comment
Please, Sign In to add comment