ListView
のFPSをどのように測定できますか?Android - ListViewや他のビューのパフォーマンスを測定するにはどうすればよいですか?
http://code.google.com/events/io/2010/sessions/world-of-listview-android.htmlからスライド13-17を参照してください。
ListView
のFPSをどのように測定できますか?Android - ListViewや他のビューのパフォーマンスを測定するにはどうすればよいですか?
http://code.google.com/events/io/2010/sessions/world-of-listview-android.htmlからスライド13-17を参照してください。
FPSの計算についてはわかりません(システム全体で実行する必要があり、ビューごとに計算されるはずはないと思いますが)Hierarchy Viewerを使用して、それぞれView
のパフォーマンスをプロファイルできます。測定に必要な時間を与え、レイアウトを計算し、それぞれView
をミリ秒単位で描画し、黄色と赤色の円を表示して遅いView
オブジェクトを見つけるのに役立ちます。
このListAdapterは別のListAdapterをラップし、1秒あたりに表示されたビューの数に関するログステートメントを出力します。
import android.database.DataSetObserver;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
public class VpsAdapter implements ListAdapter {
protected int vpsViewCount = 0;
protected long vpsStartTimeNanos = System.nanoTime();
protected ListAdapter delegate;
public VpsAdapter(ListAdapter delegate) {
super();
this.delegate = delegate;
}
public void resetViewsPerSecond() {
vpsViewCount = 0;
vpsStartTimeNanos = System.nanoTime();
}
public double getViewsPerSecond() {
final long now = System.nanoTime();
return (vpsViewCount/(double)(now - vpsStartTimeNanos)) * 1e9;
}
public int getViewsPerSecondViewCount() {
return vpsViewCount;
}
@Override
public boolean areAllItemsEnabled() {
return delegate.areAllItemsEnabled();
}
@Override
public int getCount() {
return delegate.getCount();
}
@Override
public Object getItem(int i) {
return delegate.getItem(i);
}
@Override
public long getItemId(int i) {
return delegate.getItemId(i);
}
@Override
public int getItemViewType(int i) {
return delegate.getItemViewType(i);
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
++vpsViewCount;
Log.d("VpsAdapter", String.format("VpsAdapter: %.2f views per second (%s views)", getViewsPerSecond(), getViewsPerSecondViewCount()));
return delegate.getView(i, view, viewGroup);
}
@Override
public int getViewTypeCount() {
return delegate.getViewTypeCount();
}
@Override
public boolean hasStableIds() {
return delegate.hasStableIds();
}
@Override
public boolean isEmpty() {
return delegate.isEmpty();
}
@Override
public boolean isEnabled(int i) {
return delegate.isEnabled(i);
}
@Override
public void registerDataSetObserver(DataSetObserver dataSetObserver) {
delegate.registerDataSetObserver(dataSetObserver);
}
@Override
public void unregisterDataSetObserver(DataSetObserver dataSetObserver) {
delegate.unregisterDataSetObserver(dataSetObserver);
}
}
使用するには、既存のListAdapterをVpsAdapterでラップするだけです(例:あなたは結果を取得する準備ができたら、タイミング、およびgetViewsPerSecond()
を開始する準備ができたら
setListAdapter(new VpsAdapter(myAdapter));
その後resetViewsPerSecond()
を呼び出します。また、アダプタは、getView()
へのすべてのコールに対して現在のvpsをコンソールに記録します。
このアダプタをListView.smoothScrollTo(adapter.getCount()-1)
と組み合わせて使用すると、プログラムでリストビューを下にスクロールして平均vpsを得ることができます。