inline庄敛、noinline俗壹、crossinline

Android_Banner.jpg

inline

  • 為了解決每次調(diào)用高階函數(shù)時(shí)給它傳遞lambda表達(dá)式時(shí)會(huì)創(chuàng)建匿名內(nèi)部類引入了inline關(guān)鍵字
  • inline修飾的函數(shù),不僅會(huì)把函數(shù)體的內(nèi)容進(jìn)行復(fù)制鋪平藻烤,還會(huì)把函數(shù)類型參數(shù)的內(nèi)容復(fù)制鋪平绷雏;
  • 減少一次函數(shù)調(diào)用头滔,少創(chuàng)建了一個(gè)匿名內(nèi)部類;
  • inline修飾的高階函數(shù)中不能調(diào)用私有方法(這個(gè)是確定的)
  • 如果內(nèi)聯(lián)函數(shù)是internal那么它內(nèi)部就能調(diào)用internal修飾的普通函數(shù)涎显;
inline fun performOperation(a: Int, b: Int, crossinline operation: (Int, Int) -> Int): Int {
    return operation(a, b)
}

fun performMain() {
    performOperation(1, 2) { a, b ->
        a + b
    }
}


public static final int performOperation(int a, int b, @NotNull Function2 operation) {
      int $i$f$performOperation = 0;
      Intrinsics.checkNotNullParameter(operation, "operation");
      return ((Number)operation.invoke(a, b)).intValue();
   }

   public static final void performMain() {
      byte a$iv = 1;
      int b$iv = 2;
      int $i$f$performOperation = false;
      int var5 = false;
      int var10000 = a$iv + b$iv;
   }

noinline

  • 當(dāng)在內(nèi)聯(lián)函數(shù)中想把某個(gè)函數(shù)類型的參數(shù)進(jìn)行傳遞或者返回坤检,這時(shí)就不能把這個(gè)參數(shù)鋪平,所以引入了noinline關(guān)鍵字

return與inline之間的約定

  • 在非inline函數(shù)中期吓,return無(wú)法使用(必須使用return@xxx 指明返回的函數(shù))早歇,只有在inline函數(shù)中可以使用return語(yǔ)句這樣就不會(huì)有異議;
inline fun inlineFunction(block: () -> Unit) {
    println("Before inline")
    block()
    println("After inline")
}

fun main() {
    println("Start")
    inlineFunction {
        println("Inside inline")
        return // 非局部返回讨勤,從 main 函數(shù)返回
    }
    println("End")
}

crossinline

  • crossinline是告訴IDE箭跳,lambda表達(dá)式的局部不能使用return
inline fun performOperation(a: Int, b: Int, crossinline operation: (Int, Int) -> Unit) {
    operation(a, b)
}

fun performMain() {
    performOperation(1, 2) { a, b ->
        a + b
        // 此處使用 return 語(yǔ)句來(lái)中斷代碼執(zhí)行是不被允許的,因?yàn)閏rossinline關(guān)鍵字的作用
    }
    Log.d("TAG", "performMain: ")
}

JMH 測(cè)試 inline

調(diào)用一次
inline-jmh-1.png
嵌套調(diào)用10次
@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 3)
@Measurement(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
open class InlineBenchmark {

    private fun foo(block: () -> Unit) {
        block()
    }

    private inline fun fooInline(block: () -> Unit) {
        block()
    }

    @Benchmark
    fun testNoInline() {
        var i = 0
        foo {
            foo {
                foo {
                    foo {
                        foo {
                            foo {
                                foo {
                                    foo {
                                        foo {
                                            foo {
                                                i++
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

        }
    }

    @Benchmark
    fun testInline() {
        var i = 0
        fooInline {
            fooInline {
                fooInline {
                    fooInline {
                        fooInline {
                            fooInline {
                                fooInline {
                                    fooInline {
                                        fooInline {
                                            fooInline {
                                                i++
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

        }
    }
}

fun main() {
    val options = OptionsBuilder()
        .include(InlineBenchmark::class.java.simpleName)
        .resultFormat(ResultFormatType.JSON)
        .build()

    Runner(options).run()
}
inline-jmh.png

可以看到當(dāng)處于嵌套多次調(diào)用時(shí)潭千,使用inline關(guān)鍵字的性能要遠(yuǎn)好于noinline

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谱姓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子脊岳,更是在濱河造成了極大的恐慌,老刑警劉巖垛玻,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件割捅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡帚桩,警方通過(guò)查閱死者的電腦和手機(jī)亿驾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)账嚎,“玉大人莫瞬,你說(shuō)我怎么就攤上這事」叮” “怎么了疼邀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)召锈。 經(jīng)常有香客問(wèn)我旁振,道長(zhǎng),這世上最難降的妖魔是什么涨岁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任拐袜,我火速辦了婚禮,結(jié)果婚禮上梢薪,老公的妹妹穿的比我還像新娘蹬铺。我一直安慰自己,他們只是感情好秉撇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布甜攀。 她就那樣靜靜地躺著秋泄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赴邻。 梳的紋絲不亂的頭發(fā)上印衔,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音姥敛,去河邊找鬼奸焙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛彤敛,可吹牛的內(nèi)容都是我干的与帆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼墨榄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼玄糟!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起袄秩,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤阵翎,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后之剧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體郭卫,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年背稼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贰军。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蟹肘,死狀恐怖词疼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帘腹,我是刑警寧澤贰盗,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站阳欲,受9級(jí)特大地震影響童太,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胸完,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一书释、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赊窥,春花似錦爆惧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)芍耘。三九已至,卻和暖如春熄阻,著一層夾襖步出監(jiān)牢的瞬間斋竞,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工秃殉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坝初,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓钾军,卻偏偏與公主長(zhǎng)得像鳄袍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吏恭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容