Android - 如何衡量ListView和其他视图的性能?

时间:2011-07-21 21:42:07

标签: android performance listview frame-rate

如何衡量ListView的费用?

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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(),在准备好检索结果时调用getViewsPerSecond()。每次调用getView()时,适配器还会向控制台记录当前的vps。

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