成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

90 % Java 程序員被誤導(dǎo)的一個性能優(yōu)化策略

mdluo / 1891人閱讀

摘要:接觸這么久以來,相信很多程序員都被這種代碼性能優(yōu)化策略所誤導(dǎo)。所以,建議使用循環(huán)內(nèi)定義變量,這種把變量的生命周期限制在循環(huán)體范圍內(nèi),也不會出現(xiàn)業(yè)務(wù)上重用變量而導(dǎo)致嚴(yán)重的問題。

我們經(jīng)常看到一些 Java 性能優(yōu)化的書或者理念,說不要在循環(huán)內(nèi)定義變量,這樣會占用過多的內(nèi)存影響性能,而要在循環(huán)外面定義。接觸 Java 這么久以來,相信很多 Java 程序員都被這種代碼性能優(yōu)化策略所誤導(dǎo)。

看下面兩個示例,示例1在循環(huán)外定義變量,示例2是在循環(huán)內(nèi)定義變量。

/**
 * 循環(huán)外定義變量
 */
private static void outer() {
    Javastack javastack = null;
    for (int i = 0; i < 10; i++) {
        javastack = new Javastack();
    }
}

/**
 * 循環(huán)內(nèi)定義變量
 */
private static void inner() {
    for (int i = 0; i < 10; i++) {
        Javastack javastack = new Javastack();
    }
}

先來分析這兩個示例吧。

循環(huán)外定義變量

循環(huán)外定義變量,變量循環(huán)內(nèi)每次引用指向不同的對象實例,每次循環(huán)變更對象實例時,上一次被指向的對象就會被銷毀,直到最后一個循環(huán)。這樣,循環(huán)結(jié)束后,這個變量還存在,并指向循環(huán)內(nèi)最后一個對象實例,其他對象都銷毀了。

這樣,本應(yīng)該是循環(huán)體內(nèi)的生命周期變量被擴散到了循環(huán)外,如果循環(huán)外依舊用這個變量,會導(dǎo)致后面的業(yè)務(wù)發(fā)生不可預(yù)知的后果。這種問題在筆者工作當(dāng)中經(jīng)常會遇到,看下面的例子。

/**
 * 循環(huán)外定義變量
 */
private static void outer() {
    Javastack javastack1 = null;
    for (int i = 0; i < 10; i++) {
        javastack1 = new Javastack();
    }

   Javastack javastack2 = userDao.getUser(10);
   
}

上面定義了一個 javastack2 ,如果此時在后續(xù)代碼或者傳遞到別的方法時寫錯了,用了 javastack1,那這時不就有問題了嗎?這只是一方面,還有如果用同一變量名,當(dāng)這一變量被重用時發(fā)生異常,本來發(fā)生異常應(yīng)該是 null 值的,結(jié)果得到了是之前循環(huán)體內(nèi)的值。

循環(huán)內(nèi)定義變量

循環(huán)內(nèi)定義變量,和循環(huán)外略有不同的是,每次都會創(chuàng)建新的局部變量指向新的對象實例,每個變量和對象的生命周期僅限于在循環(huán)體之內(nèi),而且每次循環(huán)結(jié)束該局部變量和對象實例都會隨著循環(huán)體的結(jié)束而銷毀,所以不存在占用更多的內(nèi)存這一說法。

總結(jié)

兩種用法都會創(chuàng)建相同數(shù)量的對象實例,只不過循環(huán)內(nèi)會反復(fù)創(chuàng)建相同數(shù)量的局部變量,棧內(nèi)存垃圾回收頻率也會更高,但對于堆垃圾回收帶來的性能影響和變量生命周期帶來的業(yè)務(wù)影響來說,棧內(nèi)存這點性能影響可以忽略不計。

所以,建議使用循環(huán)內(nèi)定義變量,這種把變量的生命周期限制在循環(huán)體范圍內(nèi),也不會出現(xiàn)業(yè)務(wù)上重用變量而導(dǎo)致嚴(yán)重的問題。

推薦:Spring Boot & Cloud 最強技術(shù)教程

掃描關(guān)注我們的微信公眾號,干貨每天更新。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71457.html

相關(guān)文章

  • 推薦:7 月份值得一看 Java 技術(shù)干貨!

    摘要:月底了,又到了我們總結(jié)這一個月技術(shù)干貨的時候了,又到了我們給粉絲免費送書的日子了。 月底了,又到了我們總結(jié)這一個月 Java 技術(shù)干貨的時候了,又到了我們給粉絲免費送書的日子了。 7 月份干貨總結(jié) Oracle 發(fā)布了一個全棧虛擬機 GraalVM 一文帶你深入拆解 Java 虛擬機 圖文帶你了解 8 大排序算法 Spring Boot 2.x 新特性總結(jié)及遷移指南 Spring B...

    saucxs 評論0 收藏0
  • 【面試精選】關(guān)于大型網(wǎng)站系統(tǒng)架構(gòu)你不得不懂10個問題

    摘要:降級往往會指定不同的級別,面臨不同的異常等級執(zhí)行不同的處理。談?wù)勀銓偷恼J(rèn)識兩者關(guān)系具體可以看公眾號阿里巴巴中間件的這篇文章獨家解讀從微服務(wù)框架到微服務(wù)生態(tài)與并不是競爭關(guān)系,作為成熟的框架,其易用性擴展性和健壯性已得到業(yè)界的認(rèn)可。 該文已加入筆主的開源項目——JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識的文檔類項目),地址:https://github.com/...

    leiyi 評論0 收藏0
  • 【面試精選】關(guān)于大型網(wǎng)站系統(tǒng)架構(gòu)你不得不懂10個問題

    摘要:降級往往會指定不同的級別,面臨不同的異常等級執(zhí)行不同的處理。談?wù)勀銓偷恼J(rèn)識兩者關(guān)系具體可以看公眾號阿里巴巴中間件的這篇文章獨家解讀從微服務(wù)框架到微服務(wù)生態(tài)與并不是競爭關(guān)系,作為成熟的框架,其易用性擴展性和健壯性已得到業(yè)界的認(rèn)可。 該文已加入筆主的開源項目——JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識的文檔類項目),地址:https://github.com/...

    luqiuwen 評論0 收藏0
  • JavaScript 是如何工作JavaScript 共享傳遞和按值傳遞

    摘要:它對數(shù)組和對象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執(zhí)行期間存儲在堆棧中。返回值這是可選的,函數(shù)可以返回值,也可以不返回值。變量被推入堆棧,從而在執(zhí)行時成為的副本。 這是專門探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 22 篇。 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 如果你錯過了前面的章節(jié),可...

    keithyau 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<