1. 程式人生 > >java效能優化(乾貨)--降低時間與空間消耗

java效能優化(乾貨)--降低時間與空間消耗

前言

我們提出一些通過降低時間與間消耗來改進java程式執行時間的建議。 這裡沒有什麼魔術的技巧,僅僅在避免常見問題上提出建議。

1 降低時間消耗

1.1 基本程式碼優化

不要期望java編譯器(例如javac或jikes)去做許多聰明的優化。 因為java有比較嚴格的語句次序和執行緒語義,所以相對於C或者Fortran等比較少嚴格定義的語言, 要安全的提高java程式的效能,編譯器能做的事情很有限。但是你可以改進你自己的java原始碼,來做到這點。

注: 理解為語句上的次序 
注: 嚴格定義指語法上限制

  • 把迴圈不變數的計算移到迴圈之外。例如,避免重複計算一個for迴圈裡的邊界,像這樣:
1
for (int i=0; i<size()*2; i++) { ... }

應該僅計算一次迴圈邊界,然後把結果賦值給一個本地變數,像這樣:

1
for (int i=0, stop=size()*2; i<stop; i++) { ... }
  • 不要重複計算同樣的子表示式:
1
2
if (birds.elementAt(i).isGrower()) ...
if (birds.elementAt(i).isPullet
()) ...

應該計運算元表示式一次,然後把結果賦值給一個變數,並且重用這個變數:

1
2
3
Bird bird = birds.elementAt(i);
if (bird.isGrower()) ...
if (bird.isPullet()) ...
  • 每一次陣列訪問需要一個索引檢查,所以降低資料訪問次數是值得的。另外,通常java編譯器不能 自動優化多維陣列的索引。例如,內迴圈(j)的每次迭代,重新計算索引rowsum[i]和arr的第一維索引arr[i]:
1
2 3 4
double[] rowsum = new double[n];
for (int i=0; i<n; i++)
  for (int j=0; j<m; j++)
    rowsum[i] += arr[i][j];

相反,在外迴圈的每次迭代中只計算一次這些索引值:

1
2
3
4
5
6
7
8
double[] rowsum = new double[n];
for (int i=0; i<n; i++) {
  double[] arri = arr[i];
  double sum = 0.0;
  for (int j=0; j<m; j++)
    sum += arri[j];
  rowsum[i] = sum;
}

注意的是,初始化中arri = arr[i]並沒有拷貝陣列的第i行;它僅僅把陣列引用(4個位元組)賦給arri.

  • 把不變屬性宣告為final static,讓編譯器可以inline它們和預計算不變表示式。
  • 把不變的變數宣告為final,讓編譯器可以inline它們和不變表示式。
  • 如果可以的話,把一個長的if-else-if鏈替換為switch;它要快很多.
  • 加入一個長的if-else-if鏈不能替換為switch(例如因為它檢測一個String), 假如它執行很多次的話,通常值得替換為一個final static的HashMap,或類似的結構。
  • 使用’聰明的’C慣用法沒有什麼用(除了讓程式碼更隱晦),例如一個while迴圈的迴圈條件中進行所有的計算工作:
1
2
3
4

            
           

相關推薦

java效能優化(乾貨)--降低時間空間消耗

前言 我們提出一些通過降低時間與間消耗來改進java程式執行時間的建議。 這裡沒有什麼魔術的技巧,僅僅在避免常見問題上提出建議。 1 降低時間消耗 1.1 基本程式碼優化 不要期望java編譯器(例如javac或jikes)

Java效能優化三:記憶體管理垃圾回收機制,開發必備優化技巧!

一、Java 類載入機制的特點: (1)基於父類的委託機制:執行一個程式時,總是由 AppClass Loader (系統類載入器)開始載入指定的類,在載入類時,每個類載入器會將載入任務上交給其父,如果其父找不到,再由自己去載入, Bootstrap Loader (啟動類載入器)是最頂級的類載

Java開發效能優化乾貨

程式碼優化最重要的作用應該是避免未知的錯誤,因此在寫程式碼的時候,從源頭開始注意各種細節,權衡並使用最優的選擇,將會很大程度上避免出現未知的錯誤,從長遠看也極大的降低了工作量。所以說程式碼優化的目標是減小程式碼體積、提高程式碼執行效率。優化是無止境的,本文也只給出整理的一些常

菜鳥要做架構師——java效能優化之for迴圈

完成同樣的功能,用不同的程式碼來實現,效能上可能會有比較大的差別,所以對於一些效能敏感的模組來說,對程式碼進行一定的優化還是很有必要的。今天就來說一下java程式碼優化的事情,今天主要聊一下對於for(while等同理)迴圈的優化。 作為三大結構之一的迴圈,在我們編寫程式碼的時候會經常用到。

Java效能優化高階進階

目錄$ b& Z7 N" v3 B├─1 什麼是效能優化2 w5 O/ k6 p- D+ q│  ├─1.1效能優化專題-什麼是效能優化一-.mp4│  ├─1.1效能優化專題-什麼是效能優化二-.mp4│  ├─效能優化.pdf/

JAVA效能優化,架構師,分散式框架,高可用框架,微服務架構,資料庫優化

程式碼優化,一個很重要的課題。可能有些人覺得沒用,一些細小的地方有什麼好修改的,改與不改對於程式碼的執行效率有什麼影響呢?這個問題我是這麼考慮的,就像大海里面的鯨魚一樣,它吃一條小蝦米有用嗎?沒用,但是,吃的小蝦米一多之後,鯨魚就被餵飽了。 程式碼優化也是一樣,如果專案著眼於儘快無BUG上線,那麼此時可以抓

Java效能優化之JVM記憶體模型

JVM記憶體模型 首先介紹下Java程式具體執行的過程: Java原始碼檔案(.java字尾)會被Java編譯器編譯為位元組碼檔案(.class字尾); 由JVM中的類載入器載入各個類的位元組碼檔案,載入完畢之後,交由JVM執行引擎執行 在整個程式執行過程中,JVM會用==一段空間==來儲存程式執

Java效能優化技巧集錦

一、通用篇 “通用篇”討論的問題適合於大多數Java應用。   1.1 不用new關鍵詞建立類的例項 用new關鍵詞建立類的例項時,建構函式鏈中的全部建構函式都會被自己主動呼叫。但假設一個物件實現了Cloneable介面。我們能夠呼叫它的clone()方法。 clone

演算法的時間空間複雜度(一看就懂)

演算法(Algorithm)是指用來操作資料、解決程式問題的一組方法。對於同一個問題,使用不同的演算法,也許最終得到的結果是一樣的,但在過程中消耗的資源和時間卻會有很大的區別。 那麼我們應該如何去衡量不同演算法之間的優劣呢? 主要還是從演算法所佔用的「時間」和「空間」兩個維度去考量。 時間維

算法的時間空間復雜度(一看就懂)

情況 com mage 符號表 分配 結果 ++i inf 容易 算法(Algorithm)是指用來操作數據、解決程序問題的一組方法。對於同一個問題,使用不同的算法,也許最終得到的結果是一樣的,但在過程中消耗的資源和時間卻會有很大的區別。 那麽我們應該如何去衡量不同算法之

Java效能優化--for迴圈

最近在學習關於Java效能優化及JVM的一些知識,無意中想起for迴圈的應用,畢竟太多的演算法題和實際開發都會用到它,也就萌生了對它進行優化的想法。 不過這裡要提出的是,同一段程式碼在不同機器和不同版本jdk中執行可能是會出現很大差別的,我用的jdk版本:1.8.0_1

Java效能優化的50個細節(珍藏版)

原文連結: https://www.toutiao.com/i6595499804082569742/ 在JAVA程式中,效能問題的大部分原因並不在於JAVA語言,而是程式本身。養成良好的編碼習慣非常重要,能夠顯著地提升程式效能。 1. 儘量在合適的場合使用單例 使用

Java 效能優化的五大技巧

要對你的 Java 程式碼進行優化,需要理解 Java 不同要素之間的相互作用,以及它是如何與其執行時的作業系統進行互動的。使用下面這五個技巧和資源,開始學習如何分析和優化你的程式碼吧。 在我們開始之前,你也許會擔心許可的問題。Java 為 Oracle 公司所有,遵循 O

[一步步學資料結構演算法 03]-時間空間複雜度

一、什麼是複雜度分析? 1.資料結構和演算法解決是“如何讓計算機更快時間、更省空間的解決問題”。 2.因此需從執行時間和佔用空間兩個維度來評估資料結構和演算法的效能。 3.分別用時間複雜度和空間複雜度兩

Java效能優化的50個細節

在JAVA程式中,效能問題的大部分原因並不在於JAVA語言,而是程式本身。養成良好的編碼習慣非常重要,能夠顯著地提升程式效能。 1. 儘量在合適的場合使用單例 使用單例可以減輕載入的負擔,縮短載入的時間,提高載入的效率,但並不是所有地方都適用於單例,簡單來說,單例主要適用

Java效能優化之作業系統層面優化

目前常用的作業系統分為:windows,Unix(Linux),我們會分別介紹在不同系統上的調優。 一,概念 效能監控:一種以非侵入方式收集或檢視應用執行效能資料的活動,通常是指在生產,質量評估, 開發環境中實施的帶有預防或主動性的活動。 效能分析:一種以侵入方式收集執行效能資料的活

Java效能優化系列集錦

Java效能問題一直困擾著廣大程式設計師,由於平臺複雜性,要定位問題,找出其根源確實很難。隨著10多年Java平臺的改進以及新出現的多核多處理器,Java軟體的效能和擴充套件性已經今非昔比了。現代JVM持續演進,內建了更為成熟的優化技術、執行時技術和垃圾收集器。與此同時,底層

Java效能優化高階課程

課程目錄: 1 什麼是效能優化 2 效能測試與優化 3 效能優化JVM篇 4 效能優化Tomcat篇 5 效能優化mysql篇 試看連結:https://pan.baidu.com/s/1A4EMejm4G4t4ZTok6vIITA 提取碼:zwul 完整版下載:百度網盤

JAVA效能優化:細節決定成敗

程式碼優化的目標是:減小程式碼的體積;提高程式碼執行的效率 程式碼優化細節 1、儘量指定類、方法的final修飾符 帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String,整個類都是final的。為

java效能優化五大技巧

導讀 要對你的 java 程式碼進行優化,需要理解 java 不同要素之間的相互作用,以及它是如何與其執行時的作業系統進行互動的。使用下面這五個技巧和資源,開始學習如何分析和優化你的程式碼吧。 在我們開始之前, 你也許會擔心許可的問題. Java 為 Oracle