簡體   English   中英

使用Java進行多少處理和內存使用?

[英]How much processing and memory use does casting take in Java?

我正在考慮是否有兩個指針更好,每個對象子類和超級一個,或者我是否應該使用強制轉換。

這使用了多少系統資源:

objectName.functionOne();
((SubClass) objectName).functionOther();

它比以下更好:

SuperClass objectA = (SuperClass) getSameInstance();
SubClass objectB = getSameInstance();
objectA.functionOne();
objectB.functionOther();

基本上,我的主要問題是關於使用鑄造的資源,而不是制作額外的指針。 看起來我可以保存幾個在線演員陣容,例如:

((SubClass) objectName).functionOther();

但是,值得嗎?

謝謝,
GRAE

更新:

我的問題有一些不清楚的部分。 基本上,我有一個超級類,我通過一個大功能使用。 它適用於三個子類。 有些超級班級正在按照我的意願行事。 但是,我在一些地方碰到了路障,我必須使用三個不同子類中的一個來完成一個功能; 僅在其中一個子類中的函數。

我可能只有:

SuperClass instanceRef;
SubClass instanceRef2;

instanceRef.etc()
instanceRef.etc2()
instanceRef.etc3()
instanceRef2.specialSubClassOnlyCall();
instanceRef2.specialSubClassOnlyCall2();

或者我可以:

SuperClass instanceRef;

instanceRef.etc()
instanceRef.etc2()
instanceRef.etc3()
((SpecialSubClass)instanceRef).specialSubClassOnlyCall();
((SpecialSubClass)instanceRef).specialSubClassOnlyCall2();

但是,我不知道哪個更有效率。

更新2:

這是一個例子,向您展示我在說什么:

class Shape
Triangle extends Shape
Square extends Shape
Circle extends Shape
Cube extends Shape

兩個指針示例:(縮小額外指針。)

Shape pointer1 = (Shape) getSomeRandomShape();
Cube pointer2 = null;

pointer1.getWidth();
pointer1.getHeight();
pointer1.generalShapeProp();
pointer1.generalShapeProp2();
pointer1.generalShapeProp3();

if(sure_its_cube)
{
   pointer2 = (Cube) pointer1;
   pointer2.getZAxis();
   pointer2.getOtherCubeOnlyThing();
   pointer2.getOtherCubeOnlyThing2();
   pointer2.getOtherCubeOnlyThing3();
   pointer2.getOtherCubeOnlyThing4();
}

或者我可以這樣做。 (下面是一堆演員。)

Shape pointer1 = (Shape) getSomeRandomShape();

pointer1.getWidth();
pointer1.getHeight();
pointer1.generalShapeProp();
pointer1.generalShapeProp2();
pointer1.generalShapeProp3();

if(sure_its_cube)
{
   ((Cube)pointer1).getZAxis();
   ((Cube)pointer1).getOtherCubeOnlyThing();
   ((Cube)pointer1).getOtherCubeOnlyThing2();
   ((Cube)pointer1).getOtherCubeOnlyThing3();
   ((Cube)pointer1).getOtherCubeOnlyThing4();
}

那么五個演員比一個額外的指針更差嗎? 什么是六個演員,或20? 是一個演員比指針差。

GRAE

做任何使代碼更清晰的事情,忘記微優化。

從您的代碼片段可以 getSameInstance()getSameInstance()返回一個 SubClass 在這種情況下,最簡單的解決方案是

 
 
 
  
  SubClass objectB = getSameInstance(); objectB.functionOne(); objectB.functionOther();
 
  

沒有演員陣容,沒有后顧之憂:-)

正如其他人正確指出的那樣,主要關注的應該是代碼可讀性和簡單性,而不是性能。 只有當您知道自己需要時才進行優化,並且已經證明(使用分析器)代碼中存在瓶頸 即使在這種情況下,微優化在Java中也很少有用。

另外注意:如果方法很重(在這種情況下,你有效地使你的代碼變慢,而不是更快),或者有副作用(在這種情況下你的程序的行為可能會明顯改變),調用相同的方法兩次可能會有問題。

順便提一下你的代碼片段

SuperClass objectA = (SuperClass) getSameInstance();

絕對沒有必要將返回值向上轉換為SuperClass - 超類引用總是可以指向子類對象。 (我想無論如何編譯器都會忽略這樣的upcast,所以它在字節碼中沒有區別。)

更新

你還沒有發表我要求的方法的聲明。 但根據你的解釋,我認為它應該看起來像

public Shape getSomeRandomShape();

它是否正確?

這將意味着你的第二個原始代碼片段(帶有getSameInstance()調用)不正確 - 強制轉換應該是相反的方式。 你設法讓我迷惑了,所以你有一個令人困惑的答案:-)

同樣在最新的示例中,您不需要將返回值強制轉換為(Shape) ,因為它已經是Shape 演員陣容讓你的代碼變得混亂。 同樣,UPDATE 2的第二個示例中的許多強制轉換使代碼難以閱讀。 我更喜歡第一個版本,有兩個引用( 不是指針btw - Java沒有指針)。

我只關心這里的代碼可讀性 - 正如其他人已經注意到的那樣, 你真的應該浪費你的時間來考慮演員陣容的成本 只需專注於使您的代碼盡可能簡單易讀 您很可能永遠不會注意到您在上面顯示的兩個代碼片段的性能之間的微小區別(除非他們在緊密循環中執行數百萬次 - 但是,我猜,JIT會優化無論如何都被拋棄了)。 但是,您會注意到理解一個代碼段與另一個代碼段之間的差異,對於不熟悉此代碼的人 - 或者已經忘記了詳細信息的人,可能是您在大約6個月內。

轉換不是在運行時完成的“操作”。 編譯器只需要確保靜態類型安全。

剛看了JVM代碼,這兩種方法基本相同,它們實現為

CHECKCAST Main$B
INVOKEVIRTUAL Main$B.mySubMethod()V

因此存在一個小的開銷,但在兩種情況下都是相同的(因為你無論如何都要做一個向下轉換)。

可讀性和代碼維護應該是這樣的優先事項,而不是性能,除非你真正遇到瓶頸(極不可能)。

但是,沒有理由有兩個引用(指針)。 只需引用子類。 在幾乎所有情況下,您可以使用子類引用對超類引用執行任何操作(重載方法的參數是我所知道的唯一例外)。

只需使用更易於閱讀的解決方案,並保持最清潔(可能是第一個解決方案)。 在這么低的優化水平下,除了在你真正需要額外0.01%性能提升的邊緣情況下,它真的不值得。

對於它的價值,你實際上並不需要將子類強制轉換為超類引用(列出的第二個解決方案),只是反過來。 在將超類強制轉換為子類時,通常首選在強制轉換之前使用instanceof驗證其類型,而不是進行假設。

假設您有一台64位計算機,它可以節省8個字節的資源。 讓我們說你花了10分鍾考慮一下。 這是好用的時間嗎?

1 GB增加了大約100美元的服務器成本,因此8字節的成本約為0.0000008美元

10分鍾的時間最低工資價值約1美元。

資源是可重用的,你的時間不是。 更重要的是,任何人閱讀/支持您的代碼的時間可能更加昂貴,這就是簡單/清晰度更為重要的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM