1

与普通变量 mutableList、mutableMap 相比,mutableState、mutableStateList、mutableStateMap 的表现如何?如果有观察者在听,它们当然会更慢(因为触发了重组),但是如果根本没有观察者,它们之间有区别吗?

提前致谢。

4

2 回答 2

1

我不认为更慢在这里是正确的词,但是如果任何可组合物正在观察该状态变量-它将被重新组合。因此,如果过于频繁,它可能会减慢您的应用程序。

您无法真正比​​较它们,因为它们的用途完全不同。mutableState而其他人则依赖于引擎盖下的标准 kotlin 构造。它只是为 compose kotlin 编译器插件添加了“可观察”部分来观察。

于 2021-12-15T12:44:15.537 回答
0

最后我写了一个简单的类来测试性能:

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
于 2021-12-15T15:48:26.487 回答