靜態初始化中不能放入繁重計算,否則會變慢

2021-09-17 21:47:27 字數 831 閱讀 2339

在類初始化期間計算不可變資料結果,並將結果儲存在static final欄位中是一種非常常見的做法。實際上,這正是靜態初始化器的設計目標。

以下是在初始化時構建一些靜態表的典型示例:

public class staticexample 

}private static long nextvalue(long seed)

...}

在我的jdk 11.0.1膝上型電腦上,靜態初始化程式在大約540毫秒內填充100m元素的陣列。

現在讓我們簡單地刪除static並填充建構函式中的陣列。

public class nonstaticexample 

}private static long nextvalue(long seed)

public static void main(string args)

}

建構函式在138毫秒內填充類似的陣列。幾乎快4倍!

為什麼靜態初始化器會變慢?這必須與jit編譯有關。

解決方法非常簡單:

只是不要直接在未初始化的類中進行繁重的計算。如果將計算邏輯放在沒有靜態初始化程式的輔助類中,它將不會受到效能損失的影響。

public class staticexample 

return table;

}static long nextvalue(long seed) }}

靜態初始化中不能放入繁重計算,否則會變慢

在類初始化期間計算不可變資料結果,並將結果儲存在static final欄位中是一種非常常見的做法。實際上,這正是靜態初始化器的設計目標。以下是在初始化時構建一些靜態表的典型示例 public class staticexample private static long nextvalue lon...

java中靜態初始化問題

class bowl public void f1 int maker class table public void f2 int maker static bowl bowl2 new bowl 2 class cupboard public void f3 int maker static b...

java中靜態初始化塊,例項初始化塊,建構函式區別

public class people public people string name param args public static void main string args 執行效果 new兩個例項,從執行結果可以看出,靜態變數和靜態初始化塊都是在類載入到系統時,載入到系統中,靜態初始化...