0

我想使用 traceview 来衡量几个异步事件的性能。异步事件在类似于以下代码的回调中传递给我。

interface EventCallback {

    void onStartEvent(String name);

    void onStopEvent(String name);
}

每个异步事件都将以“onStartEvent”调用开始并以“onStopEvent”调用结束。

我想为每个事件创建跟踪文件。从我在这里的阅读(http://developer.android.com/tools/debugging/debugging-tracing.html#creatingtracefiles)来看,不可能跟踪异步事件,因为调用的顺序必须在“堆栈”中“结构化” “喜欢订购。因此,对“Debug.stopMethodTracing()”的调用始终适用于最近对“Debug.startMethodTracing(“calc”);”的调用。

因此,如果我按以下顺序收到回调。

onStartEvent(A)

onStartEvent(B)

onStopEvent(A)

onStopEvent(B)

这将被解释为

Debug.startMethodTracing("A");

Debug.startMethodTracing("B");

Debug.stopMethodTracing(); // 将应用于“B”而不是“A”

Debug.stopMethodTracing(); // 将应用于“A”而不是“B”

使用traceview,有没有做我想做的事?即跟踪“非结构化”异步事件?

4

1 回答 1

1

traceview可能是错误的工具。如果你真的想走这条路,你可以保持一个“活动事件计数”,只要有一个事件正在处理,就保持跟踪文件打开。这可能会导致多个事件出现在同一个跟踪文件中,但您正在跟踪 VM 中的方法调用,因此没有简单的解决方法。

如果您的事件发生在不同的线程上,您可以通过后处理步骤将它们分开。这将需要一些努力来解析数据并删除不需要的记录。(参见例如thisthis。)

您并没有真正说出您要衡量的内容。例如,如果您只想要开始/结束时间,您可以将它们写入您自己的日志文件并跳过所有跟踪视图的乐趣。

根据您所追求的,systrace可能更容易使用。不幸的是,自定义事件类 ( Trace ) 只公开了同步事件 API——如果您不介意使用反射来访问非公共接口,您也可以生成异步事件

于 2016-05-11T22:56:58.220 回答