亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Kotlin內(nèi)存陷阱inline使用技巧示例詳解

 更新時間:2022年10月14日 11:02:55   作者:Petterp  
這篇文章主要為大家介紹了Kotlin內(nèi)存陷阱inline使用技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

inline ,翻譯過來為 內(nèi)聯(lián) ,在 Kotlin 中,一般建議用于 高階函數(shù) 中,目的是用來彌補其運行時的 額外開銷。

其原理也比較簡單,在調(diào)用時將我們的代碼移動到調(diào)用處使用,從而降低方法調(diào)用時的 棧幀 層級。

棧幀: 指的是虛擬機在進行方法調(diào)用和方法執(zhí)行時的數(shù)據(jù)結(jié)構(gòu),每一個棧幀里都包含了相應的數(shù)據(jù),比如 局部參數(shù),操作數(shù)棧等等。

Jvm在執(zhí)行方法時,每執(zhí)行一個方法會產(chǎn)生一個棧幀,隨后將其保存到我們當前線程所對應的棧里,方法執(zhí)行完畢時再將此方法出棧,

所以內(nèi)聯(lián)后就相當于省了一個棧幀調(diào)用。

如果上述描述中,你只記住了后半句,降低棧幀 ,那么此時你可能已經(jīng)陷入了一個使用陷阱?

錯誤示例

如下截圖中所示,我們隨便創(chuàng)建了一個方法,并增加了 inline 關(guān)鍵字:

觀察截圖會發(fā)現(xiàn),此時IDE已經(jīng)給出了提示,它建議你移除 inline , Why? 為什么呢???

不是說內(nèi)聯(lián)可以提高性能嗎,那么不應該任何方法都應該加 inline 提高性能嗎?(就是這么倔強????)

上面我們提到了,內(nèi)聯(lián)是會將代碼移動到調(diào)用處,降低 一層棧幀,但這個性能提升真的大嗎?

再仔細想想,移動到調(diào)用處,移動到調(diào)用處。這是什么概念呢?

假設我們某個方法里代碼只有兩行(我想不會有人會某個方法只有一行吧??),這個方法又被好幾處調(diào)用,內(nèi)聯(lián)是提高了調(diào)用性能,畢竟節(jié)省了一次棧幀,再加上方法行數(shù)少(暫時拋棄虛擬機優(yōu)化這個底層條件)。

但如果方法里代碼有幾十行?每次調(diào)用都會把代碼內(nèi)聯(lián)過來,那調(diào)用處豈不??,帶來的包大小影響某種程度上要比內(nèi)聯(lián)成本更高??‍??!

如下圖所示,我們對上述示例做一個論證:

Jvm: 我謝謝你。

推薦示例

我們在文章最開始提到了,Kotlin inline ,一般建議用于 高階函數(shù)(lambda) 中。為什么呢?

如下示例:

轉(zhuǎn)成字節(jié)碼后,可以發(fā)現(xiàn),tryKtx() 被創(chuàng)建為了一個匿名內(nèi)部類 (Simple$test|1) 。每次調(diào)用時,相當于需要創(chuàng)建匿名類的實例對象,從而導致二次調(diào)用的性能損耗。

那如果我們給其增加 inline 呢???,反編譯后相應的 java代碼 如下:

具體對比圖如上所示,不難發(fā)現(xiàn),我們的調(diào)用處已經(jīng)被替換為原方法,相應的 lambda 也被消除了,從而顯著減少了性能損耗。

小結(jié)

如果查看官方庫相應的代碼,如下所示,比如 with :

public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return receiver.block()
}

不難發(fā)現(xiàn),inline 的大多數(shù)場景僅且在 高階函數(shù) 并且 方法行數(shù)較短 時適用。因為對于普通方法,jvm本身對其就會進行優(yōu)化,所以 inline 在普通方法上的的意義幾乎聊勝于無。

總結(jié)

  • 因為內(nèi)聯(lián)函數(shù)會將方法函數(shù)移動到調(diào)用處,會增加調(diào)用處的代碼量,所以對于較長的方法應該避免使用;
  • 內(nèi)聯(lián)函數(shù)應該用于使用了 高階函數(shù)(lambda) 的方法,而不是普通方法。

以上就是Kotlin內(nèi)存陷阱inline使用技巧示例詳解的詳細內(nèi)容,更多關(guān)于Kotlin內(nèi)存陷阱inline使用的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • logback-spring.xml的配置及示例詳解(直接復制粘貼可用)

    logback-spring.xml的配置及示例詳解(直接復制粘貼可用)

    在使用logback作為日志框架時,可以創(chuàng)建一個名為logback-spring.xml的配置文件來自定義日志輸出的格式和方式,下面這篇文章主要給大家介紹了關(guān)于logback-spring.xml的配置及示例詳解的相關(guān)資料,文中的代碼直接復制粘貼可用,需要的朋友可以參考下
    2024-01-01
  • SpringMVC數(shù)據(jù)輸出相關(guān)知識總結(jié)

    SpringMVC數(shù)據(jù)輸出相關(guān)知識總結(jié)

    今天帶大家學習SpringMVC的相關(guān)知識,文中對SpringMVC數(shù)據(jù)輸出作了非常詳細的代碼示例,對正在學習的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • Java深入分析動態(tài)代理

    Java深入分析動態(tài)代理

    動態(tài)代理指的是,代理類和目標類的關(guān)系在程序運行的時候確定的,客戶通過代理類來調(diào)用目標對象的方法,是在程序運行時根據(jù)需要動態(tài)的創(chuàng)建目標類的代理對象。本文將通過案例詳細講解一下Java動態(tài)代理的原理及實現(xiàn),需要的可以參考一下
    2022-07-07
  • RabbitMQ中Confirm消息確認機制保障生產(chǎn)端消息的可靠性詳解

    RabbitMQ中Confirm消息確認機制保障生產(chǎn)端消息的可靠性詳解

    這篇文章主要介紹了RabbitMQ中Confirm消息確認機制保障生產(chǎn)端消息的可靠性詳解,生產(chǎn)者將數(shù)據(jù)發(fā)送到 RabbitMQ 的時候,可能數(shù)據(jù)就在半路給搞丟了,因為網(wǎng)絡問題啥的,都有可能,需要的朋友可以參考下
    2023-12-12
  • SpringMVC入門實例

    SpringMVC入門實例

    這篇文章主要介紹了SpringMVC入門實例,在springmvc入門教程里算是比較不錯的,結(jié)構(gòu)也比較完整,需要的朋友可以參考。
    2017-11-11
  • Java+Selenium實現(xiàn)控制瀏覽器的啟動選項Options

    Java+Selenium實現(xiàn)控制瀏覽器的啟動選項Options

    這篇文章主要為大家詳細介紹了如何使用java代碼利用selenium控制瀏覽器的啟動選項Options的代碼操作,文中的示例代碼講解詳細,感興趣的可以了解一下
    2023-01-01
  • Spring與Mybatis基于注解整合Redis的方法

    Spring與Mybatis基于注解整合Redis的方法

    這篇文章主要介紹了Spring與Mybatis基于注解整合Redis的方法,本文通過實例給大家介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • Spring Boot 項目啟動失敗的解決方案

    Spring Boot 項目啟動失敗的解決方案

    這篇文章主要介紹了Spring Boot 項目啟動失敗的解決方案,幫助大家更好的理解和學習使用Spring Boot,感興趣的朋友可以了解下
    2021-03-03
  • SpringBoot淺析安全管理之OAuth2框架

    SpringBoot淺析安全管理之OAuth2框架

    安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會出現(xiàn)問題,這篇文章主要介紹了SpringBoot安全管理OAuth2框架的使用
    2022-08-08
  • Java用遞歸方法解決漢諾塔問題詳解

    Java用遞歸方法解決漢諾塔問題詳解

    漢諾塔問題是一個經(jīng)典的問題。漢諾塔(Hanoi?Tower),又稱河內(nèi)塔,源于印度一個古老傳說。本文將用Java遞歸方法求解這一問題,感興趣的可以學習一下
    2022-04-04

最新評論