Skip to content

Commit 5107c9a

Browse files
Background tasks memory benchmark: saving every iteration's results into the database and restarting the app on every iteration
1 parent 0045e12 commit 5107c9a

23 files changed

Lines changed: 444 additions & 129 deletions
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.techyourchance.android.backgroundtasksbenchmark.memory
22

3-
import com.techyourchance.android.common.application.AppMemoryInfoProvider
3+
import com.techyourchance.android.common.application.AppMemoryInfo
44

55
data class BackgroundTaskMemoryData(
6-
val appMemoryConsumption: AppMemoryInfoProvider.AppMemoryInfo,
6+
val appMemoryInfo: AppMemoryInfo,
77
) {
88
companion object {
9-
val NULL_OBJECT = BackgroundTaskMemoryData(AppMemoryInfoProvider.AppMemoryInfo(0f, 0f))
9+
val NULL_OBJECT = BackgroundTaskMemoryData(AppMemoryInfo(0f, 0f))
1010
}
1111
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.techyourchance.android.backgroundtasksbenchmark.memory
2+
3+
enum class BackgroundTasksMemoryBenchmarkPhase { THREADS, COROUTINES, THREAD_POOL}

app/src/main/java/com/techyourchance/android/backgroundtasksbenchmark/memory/BackgroundTasksMemoryBenchmarkUseCase.kt

Lines changed: 143 additions & 92 deletions
Large diffs are not rendered by default.

app/src/main/java/com/techyourchance/android/backgroundtasksbenchmark/memory/BackgroundTasksMemoryResult.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,8 @@ package com.techyourchance.android.backgroundtasksbenchmark.memory
33
data class BackgroundTasksMemoryResult(
44
val averageAppMemoryConsumption: Map<Int, BackgroundTaskMemoryData>,
55
val tasksData: Map<Int, Map<Int, BackgroundTaskMemoryData>>,
6-
)
6+
) {
7+
companion object {
8+
val NULL_OBJECT = BackgroundTasksMemoryResult(mapOf(), mapOf())
9+
}
10+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.techyourchance.android.backgroundtasksbenchmark.memory
2+
3+
import com.techyourchance.android.database.entities.backgroundtasksmemory.BackgroundTasksMemoryDao
4+
import javax.inject.Inject
5+
6+
class ClearBackgroundTaskMemoryDataUseCase @Inject constructor(
7+
private val backgroundTasksMemoryDao: BackgroundTasksMemoryDao,
8+
9+
) {
10+
11+
suspend fun clearData() {
12+
backgroundTasksMemoryDao.deleteAll()
13+
}
14+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.techyourchance.android.backgroundtasksbenchmark.memory
2+
3+
import com.techyourchance.android.common.application.AppMemoryInfo
4+
import com.techyourchance.android.database.entities.backgroundtasksmemory.BackgroundTasksMemoryDao
5+
import java.util.concurrent.ConcurrentHashMap
6+
import javax.inject.Inject
7+
8+
class FetchBackgroundTaskMemoryDataUseCase @Inject constructor(
9+
private val backgroundTasksMemoryDao: BackgroundTasksMemoryDao,
10+
11+
) {
12+
13+
suspend fun fetchData(label: String): BackgroundTasksMemoryResult {
14+
val dbEntities = backgroundTasksMemoryDao.fetchAllWithLabel(label)
15+
val sortedDbEntities = dbEntities.sortedBy { it.iteration * 100 + it.tasksGroup }
16+
val tasksData = preAllocatedDataStructures()
17+
sortedDbEntities.forEach { dbEntity ->
18+
tasksData[dbEntity.iteration]!![dbEntity.tasksGroup] = BackgroundTaskMemoryData(
19+
AppMemoryInfo(
20+
dbEntity.memoryInfo.heapMemoryKb,
21+
dbEntity.memoryInfo.nativeMemoryKb
22+
)
23+
)
24+
}
25+
return BackgroundTasksMemoryResult(
26+
computeAverage(tasksData),
27+
tasksData
28+
)
29+
}
30+
31+
private fun preAllocatedDataStructures(): MutableMap<Int, MutableMap<Int, BackgroundTaskMemoryData>> {
32+
val data = ConcurrentHashMap<Int, MutableMap<Int, BackgroundTaskMemoryData>>(
33+
BackgroundTasksMemoryBenchmarkUseCase.NUM_ITERATIONS
34+
)
35+
for (iterationNum in 0 until BackgroundTasksMemoryBenchmarkUseCase.NUM_ITERATIONS) {
36+
val iterationData = ConcurrentHashMap<Int, BackgroundTaskMemoryData>(BackgroundTasksMemoryBenchmarkUseCase.NUM_TASK_GROUPS)
37+
for (taskNum in 0 until BackgroundTasksMemoryBenchmarkUseCase.NUM_TASK_GROUPS) {
38+
iterationData[taskNum] = BackgroundTaskMemoryData.NULL_OBJECT
39+
}
40+
data[iterationNum] = iterationData
41+
}
42+
return data
43+
}
44+
45+
private fun computeAverage(tasksData: MutableMap<Int, MutableMap<Int, BackgroundTaskMemoryData>>): Map<Int, BackgroundTaskMemoryData> {
46+
val averageTasksMemoryConsumptions = ConcurrentHashMap<Int, BackgroundTaskMemoryData>(
47+
BackgroundTasksMemoryBenchmarkUseCase.NUM_TASK_GROUPS
48+
)
49+
for (taskNum in 0 until BackgroundTasksMemoryBenchmarkUseCase.NUM_TASK_GROUPS) {
50+
var sumTaskHeapMemoryConsumption = 0f
51+
var sumTaskNativeMemoryConsumption = 0f
52+
for (iterationNum in 0 until BackgroundTasksMemoryBenchmarkUseCase.NUM_ITERATIONS) {
53+
sumTaskHeapMemoryConsumption += tasksData[iterationNum]!![taskNum]!!.appMemoryInfo.heapMemoryKb
54+
sumTaskNativeMemoryConsumption += tasksData[iterationNum]!![taskNum]!!.appMemoryInfo.nativeMemoryKb
55+
}
56+
val averageHeapTaskMemoryConsumption = sumTaskHeapMemoryConsumption / BackgroundTasksMemoryBenchmarkUseCase.NUM_TASK_GROUPS
57+
val averageNativeTaskMemoryConsumption = sumTaskNativeMemoryConsumption / BackgroundTasksMemoryBenchmarkUseCase.NUM_TASK_GROUPS
58+
averageTasksMemoryConsumptions[taskNum] = BackgroundTaskMemoryData(
59+
AppMemoryInfo(
60+
averageHeapTaskMemoryConsumption,
61+
averageNativeTaskMemoryConsumption
62+
)
63+
)
64+
}
65+
return averageTasksMemoryConsumptions
66+
}
67+
68+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.techyourchance.android.backgroundtasksbenchmark.memory
2+
3+
import com.techyourchance.android.database.entities.backgroundtasksmemory.AppMemoryInfoDb
4+
import com.techyourchance.android.database.entities.backgroundtasksmemory.BackgroundTasksMemoryDao
5+
import com.techyourchance.android.database.entities.backgroundtasksmemory.BackgroundTasksMemoryDb
6+
import javax.inject.Inject
7+
8+
class SaveBackgroundTaskMemoryDataUseCase @Inject constructor(
9+
private val backgroundTasksMemoryDao: BackgroundTasksMemoryDao,
10+
11+
) {
12+
13+
suspend fun saveData(label: String, iteration: Int, data: MutableMap<Int, BackgroundTaskMemoryData>) {
14+
for (tasksGroup in data.keys) {
15+
val appMemoryInfo = data.values.toList()[tasksGroup].appMemoryInfo
16+
backgroundTasksMemoryDao.upsert(
17+
BackgroundTasksMemoryDb(
18+
0,
19+
label,
20+
iteration,
21+
tasksGroup,
22+
AppMemoryInfoDb(
23+
0,
24+
appMemoryInfo.heapMemoryKb,
25+
appMemoryInfo.nativeMemoryKb,
26+
)
27+
)
28+
)
29+
}
30+
}
31+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.techyourchance.android.common.application
2+
3+
data class AppMemoryInfo(
4+
val heapMemoryKb: Float,
5+
val nativeMemoryKb: Float,
6+
)

app/src/main/java/com/techyourchance/android/common/application/AppMemoryInfoProvider.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,6 @@ import javax.inject.Inject
55

66
class AppMemoryInfoProvider @Inject constructor() {
77

8-
data class AppMemoryInfo(
9-
val heapMemoryKb: Float,
10-
val nativeMemoryKb: Float,
11-
)
12-
138
fun getAppMemoryConsumption(): AppMemoryInfo {
149
val runtime = Runtime.getRuntime()
1510
val memoryInfo = Debug.MemoryInfo()

app/src/main/java/com/techyourchance/android/common/dependencyinjection/application/ApplicationComponent.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import dagger.Component
1212
modules = [
1313
ApplicationModule::class,
1414
SettingsModule::class,
15+
DatabaseModule::class,
1516
]
1617
)
1718
interface ApplicationComponent {

0 commit comments

Comments
 (0)