国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

mdluo / 1886人閱讀

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

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

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

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

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

先來分析這兩個示例吧。

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

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

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

/**
 * 循環(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,那這時不就有問題了嗎?這只是一方面,還有如果用同一變量名,當這一變量被重用時發(fā)生異常,本來發(fā)生異常應該是 null 值的,結果得到了是之前循環(huán)體內的值。

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

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

總結

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

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

推薦:Spring Boot & Cloud 最強技術教程

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

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

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71457.html

相關文章

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

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

    saucxs 評論0 收藏0
  • 【面試精選】關于大型網站系統架構你不得不懂10個問題

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

    leiyi 評論0 收藏0
  • 【面試精選】關于大型網站系統架構你不得不懂10個問題

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

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

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

    keithyau 評論0 收藏0

發(fā)表評論

0條評論

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