【问题标题】:what are the reasons for variance in performance measurement of android appandroid应用程序性能测量差异的原因是什么
【发布时间】:2017-10-05 13:08:59
【问题描述】:

我想跟踪我的应用在 android 上的某些操作的启动时间和时间。 我正在使用代码标记方法来测量我的应用程序中所有基本操作的时间。我在代码的不同位置插入了一些代码标记。每当到达代码标记时,我都会记录系统时间。然后我用开始和结束标记之间的时间差来测量启动时间和其他操作时间。

每次测量场景的时间时,我都会在毫秒时间内得到一些差异。例如,如果我在 10 次迭代中测量启动时间,我每次都会得到 1400 毫秒到 1600 毫秒范围内的不同值。

由于读数的差异,我并不总是 100% 确定我的更改是否会影响启动时间和其他操作时间。

据我所知,差异可能是由于以下原因:

  1. Linux 内核的 CPU 频率缩放。所以我禁用了缩放并将 scaling_governor 设置为性能。
  2. 由于设备上执行的其他进程而导致的资源使用情况。我也消除了这个。我使用库存的 android 操作系统,没有任何外部应用程序。在运行测试之前,我首先重新启动我的设备。因此,每次我运行测试时,我的设备上都会运行相同的一组应用程序。
  3. 不同的电池电量。我总是在手机 100% 充电并插入电源时运行测试。
  4. 此外,我每次都在同一台设备上进行测量。我有一个专门的设备来完成这项任务。

绩效衡量出现差异的其他原因可能是什么? 有没有更好的方法来衡量性能?

【问题讨论】:

标签: android performance profiling performance-testing perf


【解决方案1】:

应用性能可能因多种原因而有所不同。例如,

  1. 通过 CPU 将经常请求的数据保存在缓存中。

  2. Dalvik/ART 运行时缓存文件。

  3. 由于 Android 同时运行多个进程。其他进程可能会在程序的执行阶段之间执行。

  4. 垃圾收集可以随时停止执行以分析内存。

这些外部因素会影响您的时间测量,例如占用 CPU 时间、占用 I/O 通道等。您需要在多次运行中平均您的测试以尝试平均这些外部因素,准确度/精度会结果受苦。在Best method to measure execution time in Android? 中讨论了在测量执行时获取准确时间的有用讨论。

除此之外,应用方面的性能也可能有所不同。例如,

  1. App在启动过程中初始化了很多对象。

  2. 应用在 Activity 生命周期开始时做一些繁重的操作 方法 — onCreate()、onStart() 或 onResume()

  3. 布局过于丰富和/或过于复杂而无法测量和绘制 第一次。

要了解最常见的操作(如对象初始化或 Activity 生命周期方法)的性能如何,您可以使用AndroidDevMetrics

同时检查,Using Traceview from Android Studio

【讨论】:

  • 您列出的内容可能是您的应用运行缓慢的原因。如果一个应用程序在启动过程中初始化了很多对象,那么它会在你每次运行它时进行。您如何考虑由此导致的应用程序启动时间差异?如果我运行一次我的应用程序需要 1400 毫秒,如果我再次运行它需要 1500 毫秒。你对此有何解释?
  • 你在使用 Instant Run 吗?
  • 无即时运行。我的应用程序已经安装在我的设备上。我只是多次运行它并测量启动所需的时间。我的结果有些差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 2011-01-20
  • 2011-06-13
  • 1970-01-01
相关资源
最近更新 更多