Android – 如何测量ListView和其他视图的性能?

我怎样才能测量我的ListView的FPS?

请参阅http://code.google.com/events/io/2010/sessions/world-of-listviewandroid.html中的幻灯片13-17。

Solutions Collecting From Web of "Android – 如何测量ListView和其他视图的性能?"

我不知道计算FPS(我猜这应该在系统范围内完成,并不是每个视图计算),但您可以使用Hierarchy Viewer来分析每个View性能。 它为您提供了测量时间,计算布局,并以毫秒为单位绘制每个View时间,并通过显示黄色和红色圆圈来指示性能不佳的情况,帮助您find缓慢的View对象。

您可能对此ListAdapter感兴趣,它将包装另一个ListAdapter并打印出每秒显示多less个视图的日志语句。

 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中,例如。

 setListAdapter( new VpsAdapter( myAdapter ) ); 

然后在准备开始计时时调用resetViewsPerSecond() ,在准备好检索结果时调用resetViewsPerSecond() 。 每次调用getView() ,适配器也会在控制台上logging当前的vps。

我使用这个适配器与ListView.smoothScrollTo( adapter.getCount()-1 ) ,以编程方式滚动列表视图到底部,并获得平均VPS。