最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

引言

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

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

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

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

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

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

錯(cuò)誤示例

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

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

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

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

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

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

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

如下圖所示,我們對(duì)上述示例做一個(gè)論證:

Jvm: 我謝謝你。

推薦示例

我們?cè)谖恼伦铋_始提到了,Kotlin inline ,一般建議用于 高階函數(shù)(lambda) 中。為什么呢?

如下示例:

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

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

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

小結(jié)

如果查看官方庫(kù)相應(yīng)的代碼,如下所示,比如 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ù)場(chǎng)景僅且在 高階函數(shù) 并且 方法行數(shù)較短 時(shí)適用。因?yàn)閷?duì)于普通方法,jvm本身對(duì)其就會(huì)進(jìn)行優(yōu)化,所以 inline 在普通方法上的的意義幾乎聊勝于無。

總結(jié)

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

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

相關(guān)文章

  • javax.validation包里@NotNull等注解的使用方式

    javax.validation包里@NotNull等注解的使用方式

    這篇文章主要介紹了javax.validation包里@NotNull等注解的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 如何解決SpringBoot定時(shí)任務(wù)報(bào)錯(cuò)Unexpected error occurred in scheduled task問題

    如何解決SpringBoot定時(shí)任務(wù)報(bào)錯(cuò)Unexpected error occurred 

    這篇文章主要介紹了如何解決SpringBoot定時(shí)任務(wù)報(bào)錯(cuò)Unexpected error occurred in scheduled task問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • java 利用反射獲取內(nèi)部類靜態(tài)成員變量的值操作

    java 利用反射獲取內(nèi)部類靜態(tài)成員變量的值操作

    這篇文章主要介紹了java 利用反射獲取內(nèi)部類靜態(tài)成員變量的值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • maven中添加memcached.jar的配置步驟

    maven中添加memcached.jar的配置步驟

    在Java項(xiàng)目中使用Maven管理依賴時(shí),如果需要添加??memcached.jar??依賴,可以通過本文介紹的步驟進(jìn)行配置,文章通過代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-12-12
  • JAVA日志框架之JUL、JDK原生日志框架詳解

    JAVA日志框架之JUL、JDK原生日志框架詳解

    Java語(yǔ)言的強(qiáng)大之處就是因?yàn)樗鼜?qiáng)大而且成熟的生態(tài)體系,其中包括日志框架,下面這篇文章主要給大家介紹了關(guān)于JAVA日志框架之JUL、JDK原生日志框架的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • 關(guān)于JVM默認(rèn)堆內(nèi)存大小問題

    關(guān)于JVM默認(rèn)堆內(nèi)存大小問題

    這篇文章主要介紹了關(guān)于JVM默認(rèn)堆內(nèi)存大小問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java中Spring獲取bean方法小結(jié)

    Java中Spring獲取bean方法小結(jié)

    Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,如何在程序中獲取Spring配置的bean呢?下面通過本文給大家介紹Java中Spring獲取bean方法小結(jié),對(duì)spring獲取bean方法相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • 解決IntelliJ?IDEA輸出中文顯示為問號(hào)問題的有效方法

    解決IntelliJ?IDEA輸出中文顯示為問號(hào)問題的有效方法

    最近剛學(xué)到文件字節(jié)流這里,但輸出中文時(shí),出現(xiàn)了控制臺(tái)輸出問號(hào)的情況,所以下面這篇文章主要給大家介紹了關(guān)于如何解決IntelliJ?IDEA輸出中文顯示為問號(hào)問題的有效方法,需要的朋友可以參考下
    2022-07-07
  • maven 打包項(xiàng)目的幾種方式

    maven 打包項(xiàng)目的幾種方式

    maven目前在web上面的使用方式很普遍,而打包的方式也存在很多方式,本文就詳細(xì)的介紹了三種方式,具有一定的參考價(jià)值,感興趣的可以了解下
    2021-06-06
  • Scala常用List列表操作方法示例

    Scala常用List列表操作方法示例

    這篇文章主要介紹了Scala常用List列表操作方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06

最新評(píng)論

察雅县| 福建省| 安陆市| 丹凤县| 衡阳市| 西峡县| 侯马市| 新余市| 保定市| 连云港市| 民乐县| 大足县| 武威市| 翁牛特旗| 龙海市| 诸城市| 宁陵县| 孟州市| 合阳县| 乐都县| 黎城县| 西乌珠穆沁旗| 宁蒗| 溧阳市| 逊克县| 呼伦贝尔市| 双城市| 南汇区| 正定县| 泸定县| 弋阳县| 北川| 富民县| 汶上县| 淮阳县| 溆浦县| 邹平县| 秭归县| 卢龙县| 双峰县| 五峰|