Google I/O : Jetpack Compose 中常见的性能问题

前语

Jetpack Compose的运用也逐渐广泛起来,因为声明式UI的特点,Compose在开发的易用性方面有较大优势,但相信很多人关缓存英文Compose的功用问题有一些疑问。
这些问题有些是因为Compose仍是个新生事物,不行成熟导致的,有些则是因为开发测验郁闷症的20道题者的运用不当导致测验郁闷症的2测试仪0道题的。
本文首要介绍宫颈癌怎么编写和装备运笔记用程序以取得最佳功用,并指出了一些要防止的问题。

正确装备运用

假如您的Compose运用功用Go不佳,则或许意味着存在装备问题。 首先应该查看以下装备项

运用Releas缓存视笔记本插电用好还是不插电频在手机哪里找e形式构建而且运用R8

假如您发现功用问题,请保证变量的定义测验在Release形式下运转您的运用。Debug形式关于发现许多缓存视频在手机哪里找问题很有用,但它会带来显着的功用本钱,而且很难发现或许影响功用的笔记其他代码的问题。
一起您还应该运用 R8 编译器从您的运用程序中删去不用要的代工龄越长退休金越多吗码。 默许测试用例状况下,在Release形式下构建会主动运用 R8 编译器。

运用baseline profile

Compose 作为一个独自的库分发,而不是作为 Android 渠道的一部分。这种办法让咱们能够经常更新 Compo测试抑郁症se 并支撑较旧的 Android 版别。但是,变量之间的关系Compose 作为库分发也薪酬超过5000怎么扣税会产生一定的本钱。 Android 渠道代码已编译并装置在设备上。另一笔记本插电用好仍是不插电方面,库需求在运用程序启动时加载测验手机是否被监控,并在需求功用时及时解说(即JIT)。这或许会在启动时减慢运用程序的速度,而且每当它首测验英文次运用库功用时。

您能够经过界说b测验你合适学心理学吗aseline profile来进步功用。这些装备文件界说了用户主流程所需的类和办法,并与您应变量名用的测验你的自卑程度 A测试抑郁症PK 一起分发。在运用程序装置期间笔记本电脑ART 会提早编译该关键代码(即A变量是什么意思OT),变量名的命名规则以便变量是什么意思在运用程序启动时准备好运用。

界说一个好的baseline profile并不总是那么容易,因而 Compose 默许附带一个。因而默许状况下你不需求做任何额定作业。
一起,假如变量的定义您挑选界说自己的装备文件,您或许会生成一变量之间的联系个实践上不会笔记进步运用程序功用的装备文件。笔记您应该测验装备文件以验证它是否有协助。一个很好的办法是为您的运用程序编写 M测验你合适学心理学吗acrobenchmark 测验,并在您编写和修正baseline profile时查看测验成果。有关怎么为 Compose UI 编写 Macrobenchmark 测验的示例,请参阅 Macrobenchmark Compose 示例。

总得来说,运用baseline profile笔记本电脑一直充电好吗经过AOT取代JIT,加快Co缓存英文mpose首次运转的速度。
在默许状况下Compose现已自带了一个默笔记本电脑性价比排行2020认的变量名的命名规矩baseline profile,你不需求做什么额定作业就能够支撑。
但假如你要自界说baseline profile的话,需求做好测验用例,验证自界说的装备是否有用。

自界说baseline pr测试工程师ofile比较费变量与函数缓存英文,不过依据Google I/测试工程师O上给出的数据,能够达到20%到30%变量是什么意思的启动功用提高,大家笔记本电脑量泵能够笔记本电脑排名前十依据状况变量是什么意思决定是否运用

Google I/O : Jetpack Compose 中常见的功用问题

关于Compose的一些最佳实践

在编写缓存英文Compose缓存代码时你或许会碰到一些常见的过错。这些过错不影缓存的视频在哪响运转,工龄越长退休金越多吗但会危害您的 UI 功用。本节列变量名的命名规则出了一些最佳实践来协助您防止它们。

运用remember削减核缓存英文

Compose函数能够十分频频地运转,就像动缓存文件夹称号画的每一帧相同频频。 出于这个原因,你应该尽或许少地在Compose中做核算。
最常见的便是运用remember, 这样,核算只运转一次,而且能够在需求时获取成果。
例如,缓存文件夹称号这儿有一些代码显现排序的称号列表,其间排序操作比较耗时

@Composable
fun ContactList(
    contacts: List<Contact>,
    comparator: Comparator<Contact>,
    modifier: Modifier = Modifier
) {
    LazyColumn(modifier) {
        // DON’T DO THIS
        items(contacts.sortedWith(comparator)) { contact ->
            // ...
        }
    }
}

问题在于,每次重组 ContactsL缓存视频兼并ist 时,整个联系人列表都会从头工龄差一年工资差多少排序,即便列表没有更改。变量之间的联系 假如用变量户滚龚俊动列表,只要出现新行,Composable 就会从头组合。
为了解决这个问题,在LazyColum测试抑郁症n笔记本电脑一直充电好吗 之外对列表变量名进行排序,并运用 remember 存储排序后的列表:

@Composable
fun ContactList(
    contacts: List<Contact>,
    comparator: Comparator<Contact>,
    modifier: Modifier = Modifier
) {
    val sortedContacts = remember(contacts, sortComparator) {
        contacts.sortedWith(sortComparator)
    }
    LazyColumn(modifier) {
        items(sortedContacts) {
          // ...
        }
    }
}

如上,当第一次组成 ContactList 时,列测验用例表被排序笔记本电脑一次。 假如联系人或比较器更改,则从测试英文头生成排序列表。 否则,可组合项能够持续运用变量类型有哪些的排序列表。
当然:假如或许,最好将核算彻底测试移到Compose之外,缓存视频合并比如ViewMod笔记本电脑性价比排行2020el

Lazy Layout运用Key

Lazy Layout使笔记本用智能重组,仅在必要时才会产生重组。笔记本显卡天梯图Go时,缓存的视频在哪咱们能够协助它做出最佳决策。
假定用户操作导致item缓存清理笔记本电脑开不了机在列表中移动测验你合适学心理学吗。 例如,假定您显现按修正时间排序的笔记列表,最近修正的笔记在最上面。

@Composable
fun NotesList(notes: List<Note>) {
    LazyColumn {
        items(
            items = notes
        ) { note ->
            NoteRow(note)
        }
    }
}

不过,这段代码存在一定的问题。 假定底部的note产生了改变。 它现在笔记本是最近修正的note,所以它应该排在列变量泵表的顶部,而其他每个note都向下移动一个位置。

这儿的问题是,没有您的协助,Compo笔记本电脑开不了机se 不会意识到未更改的项目只是在列表中移动。 相反,Com变量泵pose 以为旧的“第 2 项”被删去并创立了一个新的,依此类推,第 3 项、第 4 项一缓存视频怎样转工商银行入相册直如此。 成果是,Com笔记本电脑排名前十验郁闷程度的问卷pose 会从头组合列表中的每一项,即便其间只要一项实践产生了缓存文件夹名称改变。

解决方案是供给item key。 为每个item供给一个安稳的key能够让 Compose 防止不用要的重组。 在这种状况下,Comp测验英文ose 能够看到现在坐落第 3 项和item过去测试你适合学心理学吗坐落第 2 的ite测验仪m相同。因为该项目的数据都没缓存英文有更改,因而 Compo测试用例se 不用从头组合它。

@Composable
fun NotesList(notes: List<Note>) {
    LazyColumn {
        items(
            items = notes,
             key = { note ->
                // Return a stable, unique key for the note
                note.id
            }
        ) { note ->
            NoteRow(note)
        }
    }
}

运用 de测试rivedStateOf 限制Go重组

在重组中运用状况的一个危险是,工龄差一年缓存清理薪酬差多少工龄差一年工资差多少假如状况快速改变,你的 UI 或许会比你预期的产生更多的重组。
例如,假定您正在显现一个可翻滚的列表。 您查看列表的状况以查看哪个item是列表中的第一个可见item变量名

val listState = rememberLazyListState()
LazyColumn(state = listState) {
    // ...
}
val showButton = listState.firstVisibleItemIndex > 0
AnimatedVisibility(visible = showButton) {
    ScrollToTopButton()
}

这儿的问题在于,假如用户翻滚列表,listStat变量与函数e缓存视频合并app 会跟着用户拖动手指而不断改变。 这意味着该列表不断被从头组合,而showButton的成果也笔记本显卡天梯图会被不断核算。
但是,您只要在firstVi公司让员工下班发手机电量截图sibleItemIndex产生改变时才需求核算showButton工龄差一年薪酬差多少 所以,这儿多缓存视频变成本地视频了很多额定的核算,会影响您的龚俊UI功用

解决方案是测试抑郁症的20道题运用derivedState测试抑郁症Ofd测验你的自卑程度erivedStateOf告知Compose只要当咱们关心的状况产生改变时,才需笔记本显卡天梯图要重组。
在这种状况下变量的界说,当firstVisible测试工程师ItemIndex产生改变时才需求重组。但假如用户还没有翻滚到足以笔记本电脑什么牌子好将新item带到顶部的程度,则不需求从头组合。

val listState = rememberLazyListState()
LazyColumn(state = listState) {
  // ...
  }
val showButton by remember {
    derivedStateOf {
        listState.firstVisibleItemIndex > 0
    }
}
AnimatedVisibility(visible = showButton) {
    ScrollToTopButton()
}

留意,假如把状况都放在ViewModel里,也就不用考虑这个了

尽或许推延读取State

您应该尽或许推延读取State。 推延读取State有助于保证 Compos缓存是什么意思e 在重组时从头运转尽或许少的代码。 例如,假如您的 UI公积金有在composable树中高高提高的状况,而且您在子composable工商银行读取状况,则能够将测验郁闷症读取的状况包装在 la测试你的自卑程度mbda 函数中。 这样做会使读取仅在实践需公积金要时产生。测试工程师

咱们来看一段Jetsnack在列表翻滚时完结Title折叠展开的代码,为了达到这个效果,Title composable需求知道翻滚偏移量,以便运用修饰符来偏移自己。 在进行优化之前,这是Jetsnack代码的简化版别:

@Composable
fun SnackDetail() {
    // ...
    Box(Modifier.fillMaxSize()) { // Recomposition Scope Start
        val scroll = rememberScrollState(0)
        // ...
        Title(snack, scroll.value)
        // ...
    } // Recomposition Scope End
}
@Composable
private fun Title(snack: Snack, scroll: Int) {
    // ...
    val offset = with(LocalDensity.current) { scroll.toDp() }
    Column(
        modifier = Modifier
            .offset(y = offset)
    ) {
        // ...
    }
}

当翻滚状况产生改变时,Compose 会寻觅最近的父重组效果域并使其无效。 在这种公积金状况下,最近的父级是可组合的是Box。 因而Go Compose 重组缓存英文变量泵变量英语B缓存视频兼并appox,而且还笔记本电脑什么牌子好重组了 Box 内的任何可组合项。 假如您将代码重构为仅读取您需求的Sta笔记本电脑排名前十te,那么您能够削减需求笔记本重组的元素数量。

@Composable
fun SnackDetail() {
    // ...
    Box(Modifier.fillMaxSize()) { // Recomposition Scope Start
        val scroll = rememberScrollState(0)
        // ...
        Title(snack) { scroll.value }
        // ...
    } // Recomposition Scope End
}
@Composable
private fun Title(snack: Snack, scrollProvider: () -> Int) {
    // ...
    val offset = with(LocalDensity.current) { scrollProvider().toDp() }
    Column(
        modifier = Modifier
            .offset(y = offset)
    ) {
    // ...
    }
}

翻滚参数现在是一个 lambda变量值。 这意味着 Title 仍然能够引证被提高的状况,但该值只能在 Title 内部读取,也便是实践需求的地方。 这样一来,当工商银行翻滚变量名值产生改变时,最近的重组规模现在是 Title composable,因而Compose 不再需求重组整个 Box

这是一个很好的改进,但咱们还能够做得更好。测试 因为咱们所做的只工龄差一年工资差多少是更改可组合标题的偏移量,这能够在布局阶段完结,而不用经过组合阶段。

Compose的阶段

与大多数其他界面工具包相同,Compose 会经过几个不同的变量是什么意思“阶段”来渲染帧。假如咱们观察一下 Android View变量是什么意思统,就测验仪会发现它有 3 个首要阶段:丈量、布局和制作。Compo测验郁闷程度的问卷se变量名的命名规矩它十工资超过5000怎么扣税分类似,但开头多了一个叫做“组合”的重缓存视频怎缓存视频变成本地视频样转入相册要阶段。

C公积金omp笔记本电脑开不了机ose缓存视频变成本地视频笔记 3 个首要阶段:测试抑郁症的20道题

  • 组合:要变量值显现笔记本插电用好笔记仍是不插电什么样的界面。Compose 运转可组合函数并创立界面说明。
  • 布局:要放置界面的位置。该阶段包括两个步骤:丈量和放置。关于布局树中的每个节点,布局元素都会依据 2D 坐标变量是什么意思来丈量并变量值放置自笔记己及缓存的视频在哪其所有缓存视频变本钱地视频子元素。
  • 制作:渲染的方法。界面元素会制作到画布(通常是设备屏幕)中。

Google I/O : Jetpack Compose 中常见的功用问题

优化状况读取

知道了Co笔记本电脑开不了机mpose的3个阶段,C枸杞om公积金pose 会履行部分状况读取盯梢,因而咱们能够在恰当阶段读取每个测验郁闷症状况,从而尽或许下降需求履行的作业量
假如咱们在布局阶段读取状况,就能够越过组合阶缓存视频变本钱地视频段,假如咱们在制作阶段读取状况,就能够越过组合和布局

Google I/O : Jetpack Compose 中常见的功用问题

因而咱们能够将offset工龄越长退休金越多吗的读取推延到布局测验你的自卑程度阶段,这样能够防止组合阶段从头履行

@Composable
private fun Title(snack: Snack, scrollProvider: () -> Int) {
    // ...
    Column(
        modifier = Modifier
            .offset { IntOffset(y = scrollProvider()) }
    ) {
      // ...
    }
}

之前代码运用了Modifier.offset(工资超过5000怎么扣税x: Dp, y: Dp),它以偏移变量与函数量为测验你合适学心理学吗参数。 经过切换到修饰符的 lambda笔记本别,您能够保证函数在布局阶段读取翻滚状况。 因而,当翻滚状况产生改变时,Compose 能够彻底越过组合阶段,直接进入宫颈癌布局阶段测试英文。 当您将频频更改的状况变量缓存传递给缓存modifier时,应尽或许运用modifierlambda 版别。

制作阶段测试仪读取状况的一个比如

缓存视频变本钱地视频面咱们看了一个在布局阶段读取测验你的自卑程度状况的比如,下面来看一下制作阶宫颈癌段读取状况的一个比笔记本显卡天梯图

// Here, assume animateColorBetween() is a function that swaps between
// two colors
val color by animateColorBetween(Color.Cyan, Color.Magenta)
Box(Modifier.fillMaxSize().background(color))

这儿盒子的背景色彩在两种色彩缓存视频兼并app之间快速切换。 因而,这种状况改变十分频频。 然笔记本电脑一直充电好吗后可组合项在背景mod测试你适合学心理学吗ifier中读取此状况。 成果,盒子必须在每一帧上从头组合,因为每一帧的色彩都在改变。

为了改善这一点,咱们能够运用基于 lambda测验郁闷症modi变量值fier:在本例中为 drawBehind。这意味着仅在制作阶段读取色彩状况。
因而,Compose 能够彻底越过组合和布局阶段,当色彩产生改变时,Compose 会直接进入缓存视频在手机哪里找制作阶段。

防止反向写入

C笔记本电脑ompo宫颈癌se 有一个核心假定,即您永久不会笔记本写入已读取的状况。 当你这样做时缓存是什么意思,它被称为反向写入,它会导致重组在每一帧上产生,无休止。缓存视频怎样转入相册
以下代码显现了此类过错的示例。

@Composable
fun BadComposable() {
    var count by remember { mutableStateOf(0) }
    // Causes recomposition on click
    Button(onClick = { count++ }, Modifier.wrapContentSize()) {
        Text("Recompose")
    }
    Text("$count")
    count++ // Backwards write, writing to state after it has been read
}

这段代码在读取了状况之后在可组合项末笔记本电脑排名前十尾的更新了状况。 假如您运转此代码,您会看到在单击导致重组的按钮后,跟着 Compose 重组此变量与函数 Composabl测试英文e,计数google器会在无限循环中迅速增加,看到读取笔记本电脑缓存是什么意思排名前十的状况已过期,因而会安排另一个重组 .

您能够经过从不在 Composition 中写入状况来彻底防止向后写入。 假如或许,请始终响应事件来更新状况,并运用 lambda 表达式,变量是什么意思就像前面的 onClick 示例相同。

总结

本文首要介绍怎么编写和装备宫颈癌Compose以取得最佳功用,并指宫颈癌出了一些要防止的问题。
想要了宫颈癌解更多的同变量名的命名笔记本电脑性价比排行2020规矩学可参考Google I/O上相关的分享:Jetpack工龄越长退休金越多吗 Com笔记本pose 中常见的功用问题

发表评论

提供最优质的资源集合

立即查看 了解详情