Android - Как я могу измерить производительность ListView и других представлений? - PullRequest
9 голосов
/ 22 июля 2011

Как я могу измерить FPS моего ListView?

См. Слайды 13-17 из http://code.google.com/events/io/2010/sessions/world-of-listview-android.html.

Ответы [ 2 ]

2 голосов
/ 18 августа 2011

Я не знаю о расчете FPS (я думаю, что это должно быть сделано для всей системы, а не для каждого просмотра), но вы можете использовать Просмотр иерархии для профилирования производительности каждого View.Это дает вам время, необходимое для измерения, вычисления макета и рисования каждого View в миллисекундах, и помогает вам находить медленные View объекты, показывая желтые и красные кружки, указывающие на плохую производительность.

0 голосов
/ 22 декабря 2012

Вас может заинтересовать этот 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(), когда будете готовы получить результат.Адаптер также будет регистрировать на консоли текущий vps для каждого вызова getView().

. Я использую этот адаптер вместе с ListView.smoothScrollTo( adapter.getCount()-1 ), чтобы программно прокрутить представление списка до дна и получить среднее значение vps..

...