gpt4 book ai didi

android - 如何理解Android SDK profile traceview...?

转载 作者:行者123 更新时间:2023-11-29 00:41:44 24 4
gpt4 key购买 nike

我有一些代码使用 Jsoup 来获取和解析一些 html 页面,然后我操作 html 树,然后将它传递给绘制它的 WebView。如果我绕过我的操作,代码在 Android SDK 模拟器上的运行时间是可接受的(2-3 秒),但是当我进行操作时,时间会跳到 Not Acceptable 程度(大约 60 秒才能加载一个页面!)。

我使用 Eclipse 和 Android SDK 对运行进行了分析,现在我正在尝试解释结果。从这里http://android-developers.blogspot.com/2010/10/traceview-war-story.html采取提示对“独占 Cpu 时间 %”进行排序配置文件。令我惊讶的是,我自己的代码甚至没有列出 1%。时间消耗最大的是 android.view.ViewGroup.drawChild(),占 11.9%。列出的第一个非 android 函数(按独占 cpu % 排序)是 java.lang.ref.Reference.get(),它在 0.4% 处列出。

但我想最奇怪的是我自己的代码,我只能找到我的 AsyncTask 的 doInBackground() 列出;这个调用的函数甚至不存在,即使我可以从调试输出中看到它们被调用了。为什么没有列出这些?

我不明白这是怎么回事。非常感谢任何提示。

最佳答案

虽然我手边没有引用资料,但我认为可以安全地假设 Android 在优先级为 android.os.Process.THREAD_PRIORITY_BACKGROUND 的线程中执行 AsyncTask.doInBackground()

这意味着这个线程是在 Linux cgroup(调度类)的上下文中调度的——总是或在频繁的情况下,我不确定并且已经阅读了各种声明——公共(public) CPU 时间的上限应用了 5% 或 10%(同样,不同的来源提出不同的说法)。

换句话说,所有后台线程必须共享 5% 或 10% 的可用 CPU 时间。再一次,我读过声称如果前台和实时任务空闲,这是动态调整的,但我很高兴自己被指向一个可靠的来源。此外,我不会指望它,因为用户可以在使用我的应用程序时收听实时音频流。

如果你调整后台Thread的优先级,像这样:

private static final int bgThreadPrio = Process.THREAD_PRIORITY_BACKGROUND +
Process.THREAD_PRIORITY_MORE_FAVORABLE;
protected YourReturnType doInBackground() {
Process.setThreadPriority(bgThreadPrio);
....
}

然后你实现了两件事。

  • 您将线程从后台 cgroup 中移出,这样它就不必与其他后台线程共享 10% 的 CPU 时间(至少目前如此,直到 Android 更改其在这方面的政策)。
  • 您为线程分配优先级,这通常不会对用户界面和实时线程产生极坏的影响,因为 THREAD_PRIORITY_DEFAULT 为 0 而 THREAD_PRIORITY_BACKGROUND 为 10。因此您的线程将以优先级 9 运行,这比 0 差得多但会避免后台任务的人为限制。

但是,您也可能会更改底层 AsyncTask 执行程序为您的 AsyncTask 提供的线程的优先级。这个 Thread 是要被回收的,它可能是单个 Thread,也可能是从池中选择的。因此,最好在应用中所有 AsyncTask 的所有 doInBackground() 方法中设置优先级。

关于android - 如何理解Android SDK profile traceview...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8933722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com