2

Jsoup を使用していくつかの html ページを取得および解析するコードがあり、それを描画する WebView に渡す前に、html ツリーを操作します。操作をバイパスすると、コードは Android SDK シミュレーターで許容できる時間 (2 ~ 3 秒) で実行されますが、操作を行うと許容できない時間 (1 つのページを読み込むだけで 60 秒以内) にジャンプします。

Eclipse と Android SDK を使用して、実行のプロファイリングを行ったので、結果を解釈しようとしています。ここからhttp://android-developers.blogspot.com/2010/10/traceview-war-story.htmlは、「排他的 Cpu 時間 %」でプロファイルをソートするためのヒントを得ました。驚いたことに、私自身のコードは 1% にもなりませんでした。最大の時間消費者は android.view.ViewGroup.drawChild() で、11.9% です。リストされている最初の Android 以外の関数 (排他的 CPU % でソート) は java.lang.ref.Reference.get() で、0.4% にリストされています。

しかし、最も奇妙なことは、自分のコードのことだと思います。AsyncTask の doInBackground() しかリストされていません。デバッグ出力でそれらが呼び出されていることがわかりますが、これが順番に呼び出す関数は存在しません。それらがリストされていないのはなぜですか?

私はこれのどれを作るべきか理解していません。どんなヒントでも大歓迎です。

4

1 に答える 1

2

参考文献は手元にありませんが、Android が優先度 android.os.Process.THREAD_PRIORITY_BACKGROUND の Thread で AsyncTask.doInBackground() を実行すると仮定しても安全だと思います。

これは、このスレッドが Linux cgroup (スケジューリング クラス) のコンテキストでスケジュールされていることを意味します。その場合、常にまたは頻繁な状況下では、よくわかりませんが、さまざまな主張を読みましたが、一般的な CPU 時間の上限は 5% です。または 10% が適用されます。

つまり、すべてのバックグラウンド スレッドは、使用可能な CPU 時間の 5% または 10% を共有する必要があります。繰り返しになりますが、フォアグラウンド タスクとリアルタイム タスクがアイドル状態の場合、これは動的に調整されるという主張を読みましたが、信頼できる情報源を自分で指摘できれば幸いです。また、ユーザーはアプリの使用中にリアルタイムのオーディオ ストリームを聞くことができるので、私はそれを期待しません。

バックグラウンド スレッドの優先度を次のように調整する場合:

private static final int bgThreadPrio = Process.THREAD_PRIORITY_BACKGROUND +
                                        Process.THREAD_PRIORITY_MORE_FAVORABLE;
protected YourReturnType doInBackground() {
    Process.setThreadPriority(bgThreadPrio);
    ....
}

その後、2 つのことを達成します。

  • 他のバックグラウンド スレッドと CPU 時間の 10% を共有する必要がないように、バックグラウンド cgroup からスレッドを持ち上げます (少なくとも現時点では、Android がこの点に関するポリシーを変更するまで)。
  • THREAD_PRIORITY_DEFAULT は 0 で、THREAD_PRIORITY_BACKGROUND は 10 であるため、スレッドに優先度を割り当てます。これは通常、ユーザー インターフェイスとリアルタイム スレッドに大きな影響を与えません。したがって、スレッドは優先度 9 で実行されます。これは 0 よりもはるかに悪いですが、バックグラウンド タスクの人為的な制限を回避します。

ただし、基になる AsyncTask エグゼキューターが AsyncTask に提供するスレッドの優先度も変更する可能性があります。このスレッドはリサイクルされます。単一のスレッドであるか、プールから選択されたスレッドである可能性があります。そのため、アプリ内のすべての AsyncTasks のすべての doInBackground() メソッドで優先度を設定することをお勧めします。

于 2013-01-08T11:42:35.863 に答える