与普通变量 mutableList、mutableMap 相比,mutableState、mutableStateList、mutableStateMap 的表现如何?如果有观察者在听,它们当然会更慢(因为触发了重组),但是如果根本没有观察者,它们之间有区别吗?
提前致谢。
与普通变量 mutableList、mutableMap 相比,mutableState、mutableStateList、mutableStateMap 的表现如何?如果有观察者在听,它们当然会更慢(因为触发了重组),但是如果根本没有观察者,它们之间有区别吗?
提前致谢。
我不认为更慢在这里是正确的词,但是如果任何可组合物正在观察该状态变量-它将被重新组合。因此,如果过于频繁,它可能会减慢您的应用程序。
您无法真正比较它们,因为它们的用途完全不同。mutableState
而其他人则依赖于引擎盖下的标准 kotlin 构造。它只是为 compose kotlin 编译器插件添加了“可观察”部分来观察。
最后我写了一个简单的类来测试性能:
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
fun main() {
val numbers = 1000000
for (i in 1 until 11) {
println("test number $i")
testNormalVariable(numbers)
testStateVariable(numbers)
testNormalList(numbers)
testStateList(numbers)
println()
}
}
fun testNormalVariable(numbers: Int) {
var normalVariable = 0
val startTime = System.currentTimeMillis()
for (i in 0 until numbers) {
normalVariable = i
}
val time = System.currentTimeMillis() - startTime
println("testNormalVariable took $time ms")
}
fun testStateVariable(numbers: Int) {
val stateVariable = mutableStateOf(0)
val startTime = System.currentTimeMillis()
for (i in 0 until numbers) {
stateVariable.value = i
}
val time = System.currentTimeMillis() - startTime
println("testStateVariable took $time ms")
}
fun testNormalList(numbers: Int) {
val normalList = mutableListOf<Int>()
val startTime = System.currentTimeMillis()
for (i in 0 until numbers) {
normalList.add(i)
}
val time = System.currentTimeMillis() - startTime
println("testNormalList took $time ms")
}
fun testStateList(numbers: Int) {
val stateList = mutableStateListOf<Int>()
val startTime = System.currentTimeMillis()
for (i in 0 until numbers) {
stateList.add(i)
}
val time = System.currentTimeMillis() - startTime
println("testStateList took $time ms")
}
很明显 mutableState 和 mutableStateList 比普通变量或 mutableList 慢得多:
test number 1
testNormalVariable took 5 ms
testStateVariable took 82 ms
testNormalList took 48 ms
testStateList took 366 ms
test number 2
testNormalVariable took 5 ms
testStateVariable took 94 ms
testNormalList took 121 ms
testStateList took 368 ms
test number 3
testNormalVariable took 0 ms
testStateVariable took 35 ms
testNormalList took 30 ms
testStateList took 319 ms
test number 4
testNormalVariable took 0 ms
testStateVariable took 27 ms
testNormalList took 25 ms
testStateList took 299 ms
test number 5
testNormalVariable took 0 ms
testStateVariable took 32 ms
testNormalList took 29 ms
testStateList took 289 ms
test number 6
testNormalVariable took 0 ms
testStateVariable took 26 ms
testNormalList took 20 ms
testStateList took 310 ms
test number 7
testNormalVariable took 0 ms
testStateVariable took 41 ms
testNormalList took 30 ms
testStateList took 413 ms
test number 8
testNormalVariable took 0 ms
testStateVariable took 25 ms
testNormalList took 28 ms
testStateList took 142 ms
test number 9
testNormalVariable took 0 ms
testStateVariable took 93 ms
testNormalList took 29 ms
testStateList took 298 ms
test number 10
testNormalVariable took 0 ms
testStateVariable took 46 ms
testNormalList took 32 ms
testStateList took 309 ms