Kotlin 性能优化利器 —— Sqeuence 原理浅析

抖音批量取消关注神器:5行JS代码搞定,告别手动操作(附详细步骤) 本文介绍了一种利用JS脚本在抖音创作者平台批量取消关注的高效方法。通过浏览器开发者工具执行简单的JavaScript代码,即可自动化模拟点击操作,快速清理大量关注列表,告别繁琐的手动操作。文中提供了详细的步骤和核心代码,适合有一定技术基础的用户参考。 阅读详情

前言

本文将介绍 Kotlin 中 序列(Sequence)的概念及使用,并介绍该惰性集合操作对集合链式调用性能优化背后的原理。

阅读本文大概需要 5 分钟,写作本文大概消耗 7 个小时

目录

序列(Sequence)

概念

在使用 Kotlin 集合操作符进行链式调用时,例如 map 和 filter 时,都会在函数内部创建中间集合,比如下面的例子,使用 map 和 filter 在 User 集合中筛选出性别为男的成员,返回结果是一个集合。

users.map(User :: sex)

序列的用法

序列的用法很简单,只需要再集合后添加asSeqence() 函数即可

users.asSequence()     .map(User :: sex)     .filter {it.sex.equals("male")}

这里插播一个概念,其中 User :: user 是成员引用,具体介绍如下

成员引用(Member References)

概念

成员引用可以使你方便的调用某个类的成员,这个成员包括对应类的属性或方法.双冒号前的是被引用的类,双冒号后是需要返回的属性或方法名,如下所示是返回 User 成员的 sex 属性:

User :: sex

成员引用可以方便的赋值给其他变量或函数,例如上述寻找性别为 male 的例子,也可以用稍微复杂的写法,如下:

users.map(user : User -> user.sex)     .filter {it.sex.equals("male")}

可见成员引用的写法可读性更强。

再谈序列

让我们回到序列介绍。上文提到使用 map 和 filter 时,都会在函数内部创建中间集合,这会导致一个问题,如果源列表,就是 users 中元素特别多,集合的链式处理会变得十分低效,原因是创建了多次中间集合。而如果先将待处理集合通过 asSequence() 方法转换为序列,再进行 map 和 filter 操作,就会变得十分高效。对于是否使用序列进行集合操作,有几个前提,如果使用不当,反而会造成性能损失。这里总结一下使用场景:

序列性能测试

上文提到,是否使用序列的条件之一是处理大量数据,那么这个阈值究竟是多少?下面来进行一个性能测试,构造一个商品列表,其中每个商品包含商品名和价格两个属性,现在要求出对每个商品的价格加价 100 后,价格为奇数 的商品的个数,这里用到了 count() 方法,作用是求得集合内满足 count 条件的元素的个数,代码如下:

/** * 商品类 */data class Commodity(var name: String, var price: String)
import java.util.*fun main(args: Array<String>) {    val commodityList = ArrayList<Commodity>()    for (i in 0..1000000) {        val goods = Commodity("商品 $i", i * 5)        commodityList.add(goods)    }    val startTime = System.currentTimeMillis()    commodityList            .asSequence() // 使用此函数代表使用 Kotlin 序列功能            .map { it.price + 100 }            .count { it % 2 != 0 }    println("consume time is ${System.currentTimeMillis() - startTime} ms")}

测试结果折线图如下,其中横坐标为集合内元素的个数,纵坐标为代码执行时间,橙色线代表未使用序列,蓝色线代表使用序列:

表格对比如下:

由图可得出如下结论:

  • 上文提到的阈值大致为「一百万」个元素,大于该阈值时,使用序列大致能带来 90 % 的性能提升

  • 在小于「十万」个元素时,使用序列反而会造成性能下降

为什么序列会提高集合操作的性能?

  1. 序列对集合的操作是惰性的。

  2. 不需要额外的创建中间集合保存链式操作的中间结果

对于第一点,惰性这个词可能给人带来迷惑,这和使用序列后,集合的计算方式有关,下面来介绍这一点,在下面这个例子中,你需要在一个整型数据集合,将每个数乘以 2 ,并找出集合中小于 10 的第一个元素。

var result = listOf(2,4,6,8,10).asSequence                  .map(it * 2)                  .find(it > 10)

find() 方法的作用是在集合中查找满足条件的第一个元素,并返回查找到的值。

下图是 Kotlin 使用序列进行处理

由图可知,所谓惰性,就是在使用 map 或 filter 等操作符的时候,在代码的执行顺序上,不会优先遍历所有的集合,即偷个懒,先对集合中第一个元素进行 map 和 filter, 然后对该元素执行 find 操作,发现满足 find 的条件,就立刻返回结果,由此可见,在有 map 和 find 或 last 等操作符组合时,序列的性能优化能发生最大的作用。

小结

  1. 在进行集合操作时,使用序列操作符,可以降低集合操作的时间和占用的空间,降低时间的原因是惰性操作,降低空间占用的原因是序列在执行操作时不会创建中间集合。

  2. 序列操作虽好,但也要视业务场景决定是否使用,否则反而会降低效率。

参考文献

  • 《实战 Kotlin 》

  • Kotlin系列之序列(Sequences)源码完全解析

最后关于作者

作者目前在深圳,13年java转Android开发,在小厂待过,也去过华为,OPPO等,去年四月份进了腾讯一直到现在。等大厂待过也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

我花了一年时间整理出一份腾讯T4级别的Android架构师全套学习资料,特别适合有3-5年以上经验的小伙伴深入学习提升。

主要包括腾讯,以及字节跳动,华为,小米,等一线互联网公司主流架构技术。如果你有需要,尽管拿走好了。至于能学会多少,真的只能看你自己

全套体系化高级架构视频;七大主流技术模块

部分展示;java内核视频+源码+笔记

 

免费分享

点击获取资料文档;

《腾讯T4级别Android架构师技术脑图+全套视频》​link.juejin.im

为什么免费分享?

我不想有很多开发者朋友因为门槛而错过这套高级架构资料,错过提升成为架构师的可能。国内程序员千千万,大多数是温水煮青蛙的现状,靠着天天加班,拿着外人以为还不错的薪资待遇。

请记住自身技术水平才是我们的核心竞争力,千万别把年轻和能加班当做本钱。

Remosaic 算法 在 4in1 传感器中,相邻的 4 个同色像素(如 4 个红色、绿色或蓝色像素)合并为 1 个“超级像素”,以提升低光环境下的感光能力。例如,在 RGGB 排列中,每个 2x2 的 Quad 单元需要恢复为 4 个独立的 R、Gr、Gb、B 像素1。:传感器通过硬件级 Remosaic 直接输出 4800 万像素的原始数据,每个像素独立记录颜色信息,解析力更高2。:传感器仅输出 1200 万像素数据,再通过软件算法插值放大到 4800 万像素,实际解析力无本质提升2。的原始数据转换为传统。 阅读详情

相关推荐

UE4 - 河流流体插件Fluid Flux

Fluid Flux可以模拟一定区域内的流体效果,由于使用顶视图所Capture的Heightfield信息,所以只支持室外开阔场景,不支持洞穴等室内场景;

GT的虚幻引擎文档 6666

静态顺序表

静态顺序表 //Sequlist.h #pragma once #include&lt;stdio.h&gt; #define MAX_SIZE 10 typedef int Datatype; typedef struct SequList { Datatype _array[MAX_SIZE]; int _size; //顺序表中有效元素的个数 }...

Miss__Hy的博客 325

实战指南:利用 LangGraph 的状态管理实现多轮对话的上下文隔离与持久化

本文详细介绍了如何利用LangGraph的状态管理机制,高效实现多轮对话中的上下文隔离与持久化。通过实战代码演示,从基础的消息历史管理到自定义状态扩展,再到使用SQLite进行生产级持久化,系统讲解了如何借助LangGraph的State和Checkpointer自动化处理对话记忆、用户隔离及数据存储,显著提升开发效率。

weixin_28396629的博客 488

[原创] Go/Rust/Kotlin 的协程和队列性能评测

综述现代的异步编程中有如下的几个概念协程 coroutine : 用户态的线程,可在某些特定的操作(如IO读取)时被挂起,以让出CPU供其他协程使用。队列 channel: 队列用于将多个协程连接起来调度运行时 runtime: 调度运行时管理多个协程,为协程分配计算资源(CPU),挂起、恢复协程由于协程是非常轻量的,所以可以在一个进程中大量的创建,runtime 会实际...

Rust语言学习交流 2727

机器人路径规划:基于冠豪猪优化算法(Crested Porcupine Optimizer,CPO)的机器人路径规划(提供MATLAB代码)

移动机器人(Mobile robot,MR)的路径规划是 移动机器人研究的重要分支之,是对其进行控制的基础。根据环境信息的已知程度不同,路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或局部已知的局部路径规划。随着科技的快速发展以及机器人的大量应用,人们对机器人的要求也越来越高,尤其表现在对机器人的智能化方面的要求,而机器人自主路径规划是实现机器人智能化的重要步骤,路径规划是指规划机器人从起点位置出发,无碰撞、安全到达指定目标位置的最优路径。

IT猿手 1367

TGK-planner编译报错PLUGINLIB_EXPORT_CLASS解决

TGK-planner编译报错解决。

latter97的博客 857

在Android平台kotlin和java的性能有差么?

在Android平台上,Kotlin和Java是两种主流的编程语言,它们都有各自的优势和特点。然而,这并不是由Kotlin本身的性能优势引起的,而是因为库的作者进行了相应的优化工作。在实际开发中,Kotlin的现代语法、空安全性以及其他方便的功能往往会让开发变得更加舒适,而这些优势在很大程度上抵消了与Java之间微小的性能差异。因此,在编译为字节码后,它们的性能方面的差异并不大。虽然Kotlin语法简洁,但是想要深入理解他的新特性,熟练的使用在工作上面还是得要花费很大的时间成本来学习,因此我给大家准备了。

m0_59162559的博客 1620

一文读懂GPU通信互联技术:GPUDirect、NVLink与RDMA

GPUDirect是NVIDIA开发的一项技术,旨在实现GPU与其他设备(如网络接口卡NIC和存储设备)之间的直接通信和数据传输,而无需CPU的参与。传统上,数据在GPU和另一个设备之间传输时,必须通过CPU,这导致潜在的性能瓶颈和延迟增加。GPUDirect技术则通过绕过CPU,直接访问和传输数据,显著提高系统性能。NVLink是NVIDIA开发的一种高速、高带宽的互连技术,用于连接多个GPU之间或GPU与其他设备(如CPU、内存等)之间的通信。

异构算力老群群(在读985计算机博士生)的技术博客 7770

Kotlin在Android开发中的性能优化技巧是什么?

Kotlin在Android开发中的性能优化是一个综合性的过程,涉及到多个方面的技巧和策略。通过了解Kotlin的性能特点、避免不必要的对象创建、合理使用协程和线程、优化数据结构和算法、减少资源消耗以及利用Kotlin的编译时特性,我们可以有效地提升应用的性能,为用户提供更好的体验。在实际开发中,我们应该根据具体需求和场景选择合适的优化手段,并持续关注和监控应用的性能表现,以便及时调整和优化。随着Kotlin在Android开发中的普及,越来越多的开发者开始关注如何在Kotlin中优化应用的性能。

AntonioMargery的博客 1092

华为OD机考2025B卷 - 报文响应时间(Java & Python& JS & C++ & C )

华为OD机考2025B卷 - 报文响应时间

算法大师! 8083

12. Web安全—渗透测试用例—敏感信息泄漏

12. Web安全—渗透测试用例—敏感信息泄漏

weixin_43567873的博客 412

不会还有人没有get到Kotlin的实用性吧?

随着科技的不断进步,编程语言也在不断发展。Kotlin,作为一种新型的编程语言,已经在Android开发领域得到了广泛应用。本文将介绍Kotlin的特性、优点以及在Android开发中的应用,让我们一起领略Kotlin的魅力。

star_nwe的博客 755

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Kotlin-性能优化利器-——-Sqeuence-原理浅析

网上高级工程师面试相关文章鱼龙混杂,要么一堆内容,要么内容质量太浅, 鉴于此我整理了上述安卓开发高级工程师面试题以及答案。希望帮助大家顺利进阶为高级工程师。目前我就职于某大厂安卓高级工程师职位,在当下大环境下也想为安卓工程师出一份力,通过我的技术经验整理了面试经常问的题,答案部分是一篇文章或者几篇文章,都是我认真看过并且觉得不错才整理出来。大家知道高级工程师不会像刚入门那样被问的问题一句话两句话就能表述清楚,所以我通过过滤好文章来帮助大家理解。现在都说互联网寒冬,其实只要自身技术能力够强,咱们就不怕。

goodhighting的博客 914

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Kotlin-性能优化利器-——-Sqeuence-原理浅析,Android进阶之光

可见成员引用的写法可读性更强。 再谈序列 让我们回到序列介绍。上文提到使用 map 和 filter 时,都会在函数内部创建中间集合,这会导致一个问题,如果源列表,就是 users 中元素特别多,集合的链式处理会变得十分低效,原因是创建了多次中间集合。而如果先将待处理集合通过 asSequence() 方法转换为序列,再进行 map 和 filter 操作,就会变得十分高效。对于是否使用序列进行集合操作,有几个前提,如果使用不当,反而会造成性能损失。这里总结一下使用场景: 序列性能测试 上文提到,是否

m0_66155658的博客 251

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: 程序员的黑砖窑,东南亚博彩骗局详解
下一篇: 最详细易懂的Java类加载机制介绍!
Android_2012_
博客等级 码龄8年 7粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值