0

コードを微調整する方法に関するいくつかの記事を読んだ後、オブジェクトと変数を宣言する方法がアプリケーションのパフォーマンスに劇的な影響を与える可能性があることがわかりました。時間の制約がAndroidプラットフォームの一部の側面に不可欠な部分になっているため、これはますます重要になっています(たとえば、一部の操作では5秒以内に結果を提供する必要があります)。

今、私は私のフラグメントクラスの1つ(完全に機能している)で次のコードを見つけました:

Activity myA = getActivity();
if(myA instanceof MainActivity) {
((MainActivity) myA).doNext();
}

オブジェクトの作成/破棄とリソースの割り当てがデバイスのバッテリーの消耗に寄与する要因の一部であることを知っていたので、コードを次のように書き直すことを念頭に置いていました。

if(getActivity() instanceof MainActivity) {
((MainActivity ) getActivity()).doNext();
}

機能的な観点から、両方のコードは同じ結果を提供しています。しかし、最も適切なアプローチは何ですか?両方のアプローチの長所と短所があり、パフォーマンスを評価する適切な方法を見つけることができず、どのカウンター(メモリ使用量、機能の速度、使用されたCPUサイクルなど)も明確ではないため、私は尋ねています)評価を実行する必要があります。

よろしくお願いします。

4

5 に答える 5

4

パフォーマンスのボトルネックになる可能性があるものを推測することは、非常に一般的な時間の無駄です。推測するのではなく、プログラム全体に何が影響するかを測定する必要があります。

オブジェクトの作成/破壊が要因の1つであることを知っている

いくつかのオブジェクトを作成することは重要ではありません。あまりにも多くのオブジェクトを作成することが重要です。量が多すぎて、どのオブジェクトが最も作成されるかは、プロファイラーを使用して決定する必要があります。

機能的な観点から、両方のコードは同じ結果を提供しています。しかし、最も適切なアプローチは何ですか?

あなたが感じるものは何でも最も簡単です。doNext次のように記述できるように、返されるクラスにメソッドを追加するのgetActivity()が最善だと思います。

getActivity().doNext();

パフォーマンスを評価する適切な方法を見つけることができません

CPUとメモリプロファイラーを使用するか、システムのさまざまなコンポーネントのパフォーマンステストを作成します。

評価を実行する必要があるカウンター(メモリ使用量、機能の速度、使用済みCPUサイクルなど)。

プロファイラーを使用できない場合は、経過時間から簡単に始めます。つまり、System.nanoTime()です。通常、必要なのはこれだけです。

于 2013-01-12T15:43:00.410 に答える
3

宣言/代入は、Javaでのオブジェクト作成ではありません。スタックに参照を置くだけです。最初のものはより明確で、おそらくより高速getActivityです(一度だけ呼び出されます)。

于 2013-01-12T15:39:11.047 に答える
1

何をするかに依存しgetActivity()ます。コードの2つのセグメントの違いは、2番目のセグメントが関数を2回呼び出すことです。関数呼び出し自体は非常に高速ですが、関数が実行していることは高速ではない可能性があります。

この関数が何であるかわからない場合は、最初の関数を使用できますが、2番目の関数の方が読みやすくなります。

于 2013-01-12T15:40:16.747 に答える
0

getActiviyが新しいオブジェクトを作成しない場合、代わりに、いくつかの基準に応じて作成されたオブジェクトを返し、計算集約的ではない場合は、2番目のアプローチの方が適しています。ただし、呼び出すたびにgetActivity新しいオブジェクトを作成する場合や、getActivity計算量が多い場合は、最初のアプローチの方が適しています。

于 2013-01-12T15:38:05.137 に答える
0

getActivity()が呼び出すたびに異なるオブジェクトを返す場合、2番目のバージョンは正しくありません。そうでない場合、2番目のバージョンは単に冗長です。どちらも2番目のバージョンを好む理由ではなく、他の理由もありません。Pater Lawreyが言うように、パフォーマンスの問題がどこにあるかを推測しようとして時間を無駄にしないでください。測定。

于 2013-01-13T00:13:54.767 に答える