Add percentiles
Change-Id: Ieb6badd177bb6f67dda199dfcb3e0f483c8c4e59
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
#include "JankTracker.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstdio>
|
||||
#include <inttypes.h>
|
||||
|
||||
@@ -95,7 +96,12 @@ void JankTracker::addFrame(const FrameInfo& frame) {
|
||||
// Fast-path for jank-free frames
|
||||
int64_t totalDuration =
|
||||
frame[FrameInfoIndex::kFrameCompleted] - frame[FrameInfoIndex::kIntendedVsync];
|
||||
uint32_t framebucket = std::min(
|
||||
static_cast<typeof sizeof(mFrameCounts)>(ns2ms(totalDuration)),
|
||||
sizeof(mFrameCounts) / sizeof(mFrameCounts[0]));
|
||||
// Keep the fast path as fast as possible.
|
||||
if (CC_LIKELY(totalDuration < mFrameInterval)) {
|
||||
mFrameCounts[framebucket]++;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -103,6 +109,7 @@ void JankTracker::addFrame(const FrameInfo& frame) {
|
||||
return;
|
||||
}
|
||||
|
||||
mFrameCounts[framebucket]++;
|
||||
mJankFrameCount++;
|
||||
|
||||
for (int i = 0; i < NUM_BUCKETS; i++) {
|
||||
@@ -119,6 +126,9 @@ void JankTracker::dump(int fd) {
|
||||
fprintf(file, "\n Total frames rendered: %u", mTotalFrameCount);
|
||||
fprintf(file, "\n Janky frames: %u (%.2f%%)", mJankFrameCount,
|
||||
(float) mJankFrameCount / (float) mTotalFrameCount * 100.0f);
|
||||
fprintf(file, "\n 90th percentile: %ums", findPercentile(90));
|
||||
fprintf(file, "\n 95th percentile: %ums", findPercentile(95));
|
||||
fprintf(file, "\n 99th percentile: %ums", findPercentile(99));
|
||||
for (int i = 0; i < NUM_BUCKETS; i++) {
|
||||
fprintf(file, "\n Number %s: %u", JANK_TYPE_NAMES[i], mBuckets[i].count);
|
||||
}
|
||||
@@ -127,10 +137,23 @@ void JankTracker::dump(int fd) {
|
||||
}
|
||||
|
||||
void JankTracker::reset() {
|
||||
memset(mBuckets, 0, sizeof(JankBucket) * NUM_BUCKETS);
|
||||
memset(mBuckets, 0, sizeof(mBuckets));
|
||||
memset(mFrameCounts, 0, sizeof(mFrameCounts));
|
||||
mTotalFrameCount = 0;
|
||||
mJankFrameCount = 0;
|
||||
}
|
||||
|
||||
uint32_t JankTracker::findPercentile(int percentile) {
|
||||
int pos = percentile * mTotalFrameCount / 100;
|
||||
int remaining = mTotalFrameCount - pos;
|
||||
for (int i = sizeof(mFrameCounts) / sizeof(mFrameCounts[0]) - 1; i >= 0; i--) {
|
||||
remaining -= mFrameCounts[i];
|
||||
if (remaining <= 0) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
} /* namespace uirenderer */
|
||||
} /* namespace android */
|
||||
|
||||
@@ -54,8 +54,11 @@ public:
|
||||
void reset();
|
||||
|
||||
private:
|
||||
uint32_t findPercentile(int p);
|
||||
|
||||
JankBucket mBuckets[NUM_BUCKETS];
|
||||
int64_t mThresholds[NUM_BUCKETS];
|
||||
uint32_t mFrameCounts[128];
|
||||
|
||||
int64_t mFrameInterval;
|
||||
uint32_t mTotalFrameCount;
|
||||
|
||||
Reference in New Issue
Block a user