2012-02-15 27 views
0

至極的更快和/或更少的資源消耗:Java的最佳實踐:使用方法性能參數

class Foo() 
{ 
    public int value; 
} 

這樣?

public int doSomeStuff(Foo f) 
{ 
    return (f.value + 1); 
} 

public int doOtherStuff() 
{ 
    ... 
    Foo f = new Foo(); 
    int x = doSomeStuff(f); 
    ... 
) 

或這種方式?

public int doSomeStuff(int v) 
{ 
    return (v + 1); 
} 

public int doOtherStuff() 
{ 
    ... 
    Foo f = new Foo(); 
    int x = doSomeStuff(f.value); 
    ... 
) 

在這兩種情況下,「doSomeStuff」不會改變foo類中的任何內容。它只需要知道「價值」。

+0

根據Java命名規則,你的類應該命名爲'Foo'而不是'foo',它會使你的代碼更 – amit 2012-02-15 12:09:24

+0

確定,修正了。謝謝。 – Christian 2012-02-15 12:35:09

回答

3

它們都執行相同的操作,發生相同的操作順序。您的主要關注點是可維護性和合理的設計。仔細考慮哪些方法需要哪些數據並正確設計。

如果確實有問題,可以稍後進行優化。但你應該總是最後優化。

+0

「但是你應該總是優化最後的。」+1 – m0skit0 2012-02-15 12:10:50

0

我不認爲有任何性能差異。而Java編譯器將優化反正最好的一個...

0

取決於你打算如何經常調用doSomeStuff沒有調用doOtherStuff,但一般的性能差異是可以忽略的,如果你只叫doOtherStuff那麼他們將是同樣高性能。

1

在資源消耗方面,它完全一樣。 但是第二個選項在編程方面顯然更好,因爲如果doSomeStuff只需要值,那麼傳遞f就沒有意義了。

0

可能更好:

Decalre doSomeStuff()foo的方法,並調用:f.doSomeStuff()

這是更可讀的,會更容易保持做下去,因爲如果你有一個 子類fooBar,並且要計算的東西有點不同 - 所有你需要做的就是在Bar

覆蓋doSomeStuff()你應該更喜歡在可讀性MI優化 - 讓編譯器爲你處理這些問題。

代碼卡:

class foo() { 
    public int value; 
    public int doSomeStuff() { 
     return value + 1; 
    } 
} 

和:

public int doOtherStuff() { 
    ... 
    foo f = new foo(); 
    int x = f.doSomeStuff(); 
    ... 
} 
0

做的區別:

object.intvariable + 1 

int + 1 

對於真實世界的應用程序而言是微不足道的。這可能是一兩個JVM操作碼來查找foo並找到它不值得一提的值變量。除非您嘗試在Java中創建僞實時應用程序(這僅僅是徒勞無功),否則您永遠不會注意到這一點。

但是,那就是說,你這樣做的方式非常糟糕。你不應該直接暴露value,而是通過getter和setter方法使用適當的數據封裝。

0

從性能的角度來看並不重要。 建議是:不要考慮過早的優化。考慮你的代碼的正確性和良好的設計。

例如代碼

  1. 沒有遵循命名約定:類名必須以大寫字母
  2. 包含公共領域開始。這是被禁止的。使用bean符號(getters和setter)。
  3. 不能編譯(沒有類型integer。選擇中intInteger
+0

1)好吧,我總是這麼做。在這種情況下,我寫這個例子的速度很快,並沒有考慮那些事情...... 2)好的,注意到了。 3)再一次,它僅用於說明。不管怎麼說,還是要謝謝你。 – Christian 2012-02-15 12:21:16