2012-09-06 38 views
0

這可能是挑剔的,但是在使用全局靜態字段用於一次性工作變量時是否有任何時間/內存效率?給出的簡單的例子:使用靜態全局工作變量有什麼優勢嗎?

class theClass { 

private static GregorianCalendar wkCal; 
private static int wkTimes1; 
private static int wkTimes2; 
private static int wkTimes3; 
private static StringBuilder wkSb = new StringBuilder(); 

void aMethod(int n) { 
    wkTimes1 = n * 1; 
    wkTimes2 = n * 2; 
    wkTimes3 = n * 3; 
    wkCal = new GregorianCalendar(); 
    wkSb.setLength(0); 
    wkSb.append("A string"); 
    // And so on... 
} 
} 

該片段有潛力被實例化多次(> 3000)和被amethod方法每實例化多次使用。此外,wk前綴字段將用於其他方法,並且設計用於保存僅用於中間計算的臨時值。

我看到它的方式,如果你留意使用全局變量的常見警告,這可以節省內存和時間。

+1

此代碼是在單個線程上運行嗎?如果是的話,這很好。如果你的代碼將來會改變以支持線程,那就不好了。 – Brian

+2

「關於使用全局變量的常見警告」是它們是邪惡的,冒險的,不可測試的,並且你不應該使用它們。(但是不,它們不會給你效率優於局部變量。) –

回答

4

如果你將它實例化了3000次(這並不多),並且每次都有超過一次的實例,那麼你需要一個很好的非確定性競爭條件。爲什麼不使用當地人並消除所有疑問?

當方法完成運行時,當地人就會離開,而不像將來在未定的時間段內被GCed調用的實例變量。

+0

我' d同意3000次執行並不多,特別是在現代多核系統上。如果方法確實需要很長時間(可能是數據庫訪問),那麼實例化/不實例化少數變量的開銷就可以忽略不計。 –

1

一般來說,靜態變量比實例字段訪問速度慢(或者至少不會更快),並且方式比本地變量慢。靜態的唯一兩個原因是,如果您需要一些事件事件的類「內存」,或者如果您有一些通過類中的方法重複訪問的常見(基本上只讀)對象(例如日曆對象) 。

對於int或其他一些標量來說,使用static也可能是一個局部變量。

對一個高度可變對象如StringBuilder使用靜態也是相當危險的。從methodA調用到methodB,您可能會意外地使用同一個對象,但結果不好。 (更不用說線程應用程序的問題了)。應該指出,分配一個本地變量 - 一個scaler int/float/whatever或者一個對象引用本質上並不需要花費,很少添加一個實例字段 - new時間初始化只是將空間調整爲零的時間(基本上它是來自堆的方式)。

0

其他人建議,我會同意它會在速度上造成微不足道的差異,並且是一種非常糟糕的形式,當你最不期待的時候會咬你或者同事。

但是,如果您不確定,則創建一個微基準來證明實現之間幾乎沒有差別。創建兩個不同版本的方法應該是一件容易的事情,然後用n的隨機值執行100,000或10,000,000次執行函數,並查看每個版本需要多長時間。

相關問題