From b2447c28ff792f7d981ebbc4c7cf50938689affa Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Mon, 9 Oct 2023 19:50:05 +0530 Subject: [PATCH] fix: log warning if cache-hit rate is below specified threshold --- .../com/itsaky/androidide/models/LogLine.java | 5 +++-- .../androidide/utils/RecyclableObjectPool.kt | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/shared/src/main/java/com/itsaky/androidide/models/LogLine.java b/shared/src/main/java/com/itsaky/androidide/models/LogLine.java index 640b51f1c..75feda97a 100644 --- a/shared/src/main/java/com/itsaky/androidide/models/LogLine.java +++ b/shared/src/main/java/com/itsaky/androidide/models/LogLine.java @@ -26,8 +26,9 @@ import java.util.Objects; public class LogLine implements Recyclable { - private static final RecyclableObjectPool logLinePool = new RecyclableObjectPool<>( - RecyclableObjectPool.CAPACITY_DEFAULT, LogLine.class, LogLine::new); + // do not cache too many LogLine items + // LogLines should be recycled as soon as they are appended to the log view + private static final RecyclableObjectPool logLinePool = new RecyclableObjectPool<>(16, LogLine.class, LogLine::new); public String unformatted; public String date; diff --git a/shared/src/main/java/com/itsaky/androidide/utils/RecyclableObjectPool.kt b/shared/src/main/java/com/itsaky/androidide/utils/RecyclableObjectPool.kt index 78fdfb371..9fd11ed6e 100644 --- a/shared/src/main/java/com/itsaky/androidide/utils/RecyclableObjectPool.kt +++ b/shared/src/main/java/com/itsaky/androidide/utils/RecyclableObjectPool.kt @@ -36,6 +36,9 @@ class RecyclableObjectPool @JvmOv companion object { var DEBUG = false + var LOG_METRICS_ON_N_ACCESS = 400 + + private const val CACHE_HIT_WARNING_THRESHOLD = 50f private val log by lazy { ILogger.newInstance("RecyclableObjectPool") @@ -89,7 +92,7 @@ class RecyclableObjectPool @JvmOv accCount.set(IntPair.pack(access, ++cacheHit)) } ?: objFactory.create() - if (DEBUG && access % 100 == 0) { + if (DEBUG && access % LOG_METRICS_ON_N_ACCESS == 0) { logMetrics() } @@ -127,16 +130,28 @@ class RecyclableObjectPool @JvmOv val rec = recCount.get() val access = IntPair.getFirst(acc) val cacheHit = IntPair.getSecond(acc) + val cacheHitRate = cacheHitRate() val simpleName = objName.let { if (it.contains('.')) it.substringAfterLast('.') else it } log.debug("${javaClass.simpleName}: $simpleName($objName)") log.debug(" Recycle count : $rec") log.debug(" Access count : $access") log.debug(" Cache hit count : $cacheHit") - log.debug(" Cache hit rate : ${cacheHitRate()}%") + log.debug(" Cache hit rate : $cacheHitRate%") log.debug(" Cache miss rate : ${cacheMissRate()}%") log.debug(" Recycle rate : ${recycleRate()}%") log.debug(" Cache utilization rate : ${cacheUtilization()}%") + log.debug(" Objects in cache : ${cache.size}") + + if (cacheHitRate < CACHE_HIT_WARNING_THRESHOLD) { + // Cache hit rate is less than threshold + // something might be wrong + // log an error + log.error("!!!!!!!!!!!!!!!!!!!!! CRITICAL ERROR !!!!!!!!!!!!!!!!!!!!!") + log.error("Cache-hit rate for '${simpleName}' is less than ${CACHE_HIT_WARNING_THRESHOLD}%!!") + log.error("Make sure that instances of $objName are obtained using the object pool") + log.error("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") + } } /**