TDD calc cache optimization

This commit is contained in:
Sergey Zorchenko 2022-09-11 14:34:19 +03:00
parent 64e016e65f
commit 4c1bfce6c5
2 changed files with 22 additions and 14 deletions

View file

@ -43,7 +43,7 @@ class ProfileFunctionImplementation @Inject constructor(
private val deviceStatusData: DeviceStatusData
) : ProfileFunction {
val cache = LongSparseArray<Profile>()
val cache = HashMap<Long,Profile?>()
private val disposable = CompositeDisposable()
@ -54,10 +54,10 @@ class ProfileFunctionImplementation @Inject constructor(
.subscribe(
{
synchronized(cache) {
for (index in cache.size() - 1 downTo 0) {
if (cache.keyAt(index) > it.startDate) {
aapsLogger.debug(LTag.AUTOSENS, "Removing from profileCache: " + dateUtil.dateAndTimeAndSecondsString(cache.keyAt(index)))
cache.removeAt(index)
for (key in cache.keys) {
if (key > it.startDate) {
aapsLogger.debug(LTag.AUTOSENS, "Removing from profileCache: " + dateUtil.dateAndTimeAndSecondsString(key))
cache.remove(key)
} else {
break
}
@ -98,14 +98,17 @@ class ProfileFunctionImplementation @Inject constructor(
val rounded = time - time % 1000
// Clear cache after longer use
synchronized(cache) {
if (cache.size() > 30000) {
if (cache.keys.size > 30000) {
cache.clear()
aapsLogger.debug("Profile cache cleared")
}
val cached = cache[rounded]
if (cached != null) return cached
if (cache.containsKey(rounded)) {
//aapsLogger.debug(LTag.PROFILE, "Profile cache HIT for $rounded")
return cache[rounded]
}
}
// aapsLogger.debug("getProfile called for $time")
//aapsLogger.debug(LTag.PROFILE, "Profile cache MISS for $rounded")
val ps = repository.getEffectiveProfileSwitchActiveAt(time).blockingGet()
if (ps is ValueWrapper.Existing) {
val sealed = ProfileSealed.EPS(ps.value)
@ -130,6 +133,9 @@ class ProfileFunctionImplementation @Inject constructor(
}
}
synchronized(cache) {
cache.put(rounded, null)
}
return null
}

View file

@ -99,7 +99,7 @@ class TddCalculator @Inject constructor(
}
fun calculateToday(): TotalDailyDose {
var startTime = MidnightTime.calc(dateUtil.now())
val startTime = MidnightTime.calc(dateUtil.now())
val endTime = dateUtil.now()
return calculate(startTime, endTime)
}
@ -111,7 +111,9 @@ class TddCalculator @Inject constructor(
}
fun calculate(startTime: Long, endTime: Long): TotalDailyDose {
val tdd = TotalDailyDose(timestamp = startTime)
val startTimeAligned = startTime - startTime % (5 * 60 * 1000)
val endTimeAligned = endTime - endTime % (5 * 60 * 1000)
val tdd = TotalDailyDose(timestamp = startTimeAligned)
repository.getBolusesDataFromTimeToTime(startTime, endTime, true).blockingGet()
.filter { it.type != Bolus.Type.PRIMING }
.forEach { t ->
@ -121,14 +123,14 @@ class TddCalculator @Inject constructor(
tdd.carbs += t.amount
}
val calculationStep = T.mins(5).msecs()
for (t in startTime until endTime step calculationStep) {
val tbr = iobCobCalculator.getTempBasalIncludingConvertedExtended(t)
for (t in startTimeAligned until endTimeAligned step calculationStep) {
val profile = profileFunction.getProfile(t) ?: continue
val absoluteRate = tbr?.convertedToAbsolute(t, profile) ?: profile.getBasal(t)
val tbr = iobCobCalculator.getBasalData(profile, t)
val absoluteRate = tbr.tempBasalAbsolute
tdd.basalAmount += absoluteRate / 60.0 * 5.0
if (!activePlugin.activePump.isFakingTempsByExtendedBoluses) {
// they are not included in TBRs
val eb = iobCobCalculator.getExtendedBolus(t)
val absoluteEbRate = eb?.rate ?: 0.0
tdd.bolusAmount += absoluteEbRate / 60.0 * 5.0