【问题标题】:Android - How can I measure performance of ListView and other Views?Android - 如何衡量 ListView 和其他视图的性能?
【发布时间】:2012-12-22 06:06:14
【问题描述】:

如何测量我的ListView 的 FPS?

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

【问题讨论】:

    标签: android performance listview frame-rate


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可能对这个 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。

      【讨论】:

        猜你喜欢
        • 2021-09-23
        • 1970-01-01
        • 2022-11-11
        • 1970-01-01
        • 2011-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多