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(); // "A" ではなく "B" に適用されます

Debug.stopMethodTracing(); // "B" ではなく "A" に適用されます

トレースビューを使用して、とにかく私がやりたいことはありますか? つまり、「構造化されていない」非同期イベントをトレースしますか?

4

1 に答える 1

1

traceviewは間違ったツールである可能性があります。本当にこのルートに行きたい場合は、「アクティブなイベント数」を保持し、処理中のイベントがある限りトレースファイルを開いたままにすることができます。これにより、同じトレース ファイルに複数のイベントが存在する可能性がありますが、VM でメソッド呼び出しをトレースしているため、これを回避する簡単な方法はありません。

イベントが異なるスレッドで発生する場合は、後処理ステップでそれらを分離できます。これには、データを解析して望ましくないレコードを削除するための努力が必要です。(たとえば、 thisまたはthisを参照してください。)

何を測定しようとしているのか、あなたは本当に言いません。たとえば、開始時間と終了時間だけが必要な場合は、それらを独自のログ ファイルに書き込んで、すべての traceview fun をスキップできます。

求めているものによっては、systraceを使用する方が簡単な場合があります。残念ながら、カスタム イベント クラス ( Trace ) は同期イベント API を公開するだけです。リフレクションを使用して非公開インターフェイスにアクセスすることを気にしない場合は、非同期イベントを生成することもできます。

于 2016-05-11T22:56:58.220 に答える