2016-12-10 3 views
3

Aを拡張するオブジェクトAとBがあるとしましょう。 BにはA(配列といくつかのカウンタ)とは関係のないグローバル変数があります。Androidのパフォーマンス:役に立たないグローバル変数と継承

明示的なキャストにはコストがかかります(私はどれくらいの高さであるか分かりません)。クラスAを作成し、必要な場合のみ配列を作成して、キャストするには?

私が疑問に思うのは、オブジェクトのグローバル変数は、たとえ未使用のものであっても、まったく費用がかかりますか?

編集:明らかに、最も重要な機能を追加するのを忘れてしまった。

答えて

1

明らかに、いいえ、1つのクラスに両方のクラスをブレンドしないでください。あなたが言及したように、配列はクラスAとは無関係です。

次に、あなたのケースでは、ダウンキャスティングは以下を示すポイントです:プログラマー待ち、もう少し考えてみませんか?場合によっては、ダウンキャストを必要としないソリューションがあります。しかし

明示的なキャストが、私はそうは思わない

コストがかかるので。いくつかのベンチマークと拡張がありますが、大きな違いはありません。

expansion

benchmark

Soが https://dzone.com/articles/is-inheritance-dead

私たちは純粋なパフォーマンスの用語で話す場合は、空の配列を取ります。それは別の問題につながる可能性があるため、最初のソリューション...

近年
+0

キャストに失敗したらどうなりますか? – zuokuok

+0

@zuokuokそれに対処するために 'instanceof'キーワードを使用してください –

2

、継承は多くの場合、コードのにおいのように扱われているに従ってください約8バイトのRAM(4バイトの長さと4バイトの参照ですが、少しプラットフォームに依存します:How much space array occupies)。したがって、たとえ数千ものオブジェクトがあっても、1つの配列フィールドには、RAMで約1〜1000 * 8バイト〜8 KByteが必要です。

おそらくご存じのように、今日の携帯電話には通常、1ギガバイト以上のRAMが搭載されています。ただし、お使いのアプリが通常60〜192 MBのRAM(Detect application heap size in Android)を使用できることを忘れないでください。

いずれにしても、クラスに追加しているすべての小さなフィールドを数えてはいけません。それはEffective Java

更新パフォーマンスについて
で提案されたよう

はしかし、私の最初の文に戻って、私はあなたを示唆している、あなたが代わりに相続の組成物を使用し、問題の解決を考えることをお勧めこのトピックを読む:The performance impact of using instanceof in Javaあなたは早すぎる最適化のようなタイプが必要ですか?それとも実用以上の理論的な質問ですか?

+0

質問に答えるには、あるクラスを使用する方がパフォーマンスが向上しますか? – zuokuok

+0

これは、1)あなたが持っているオブジェクトの数2)あなたのユースケース:どのようにこのオブジェクトを使用するかによって決まります。この追加情報で質問を更新できますか? – Gaket

0

明示的なキャストが、それは全くのパフォーマンスのPOVから、 良いだろう、(私はどのくらいか分からない)コストがかかるので、のみにクラスAを作成し、 は私がなるように必要な場合にのみ、配列を作成しますキャストする必要はありませんか?

キャスティングの費用についての疑わしい主張の他に、多分私は誤解しているかもしれませんが、それは私のために赤旗を発生させました。デザインにサブクラスにオブジェクトをキャストする必要がある場合は、おそらく他の方法でよりうまく設計できます。私は何も見ていないと言うことはできませんが、キャストの必要性はしばしば設計上の失敗の兆候です*。 Gaketが示唆しているように、構成はより良いかもしれませんし、おそらく他のいくつかの変更 - 工場パターンがあるかもしれませんか?

第2に、パフォーマンスの問題に気づいた場合や、パフォーマンスの問題があると思われる本当の理由がある場合にのみ、パフォーマンスを気にする必要があります。プロセッサが何とか何度も何度も(何百万というように)実行されていないかぎり、かなり高速になるでしょう。パフォーマンスの問題(プログラムが何らかの形で珍しい場合を除き)は、I/Oまたはメモリになる可能性が最も高いです。あなたは、パフォーマンスのボトルネックを特定しているの後に続いて、それを修正する手順は次のとおりです。

    1. 策は、メジャー

    はいずれも除外しないでください目標

  • 修正
  • を設定しましたステップ。

    *キャストは、Androidのプログラミングの中心的な部分であることがわかります。なぜなら、キャストするたびにビューをキャストしなければならないからです。これを行うには良い方法があるのだろうかと思います。

  • 関連する問題